OpenSSL je neuvěřitelně univerzální kus software, který najdeme v různých podobách prakticky v každém počítači, telefonu, tabletu a jiném zařízení. Je rozšířenější, než si většina z nás vůbec umí představit. Implementuje mnoho různých vzájemně souvisejících funkcí. Například:
- symetrické šifrování a dešifrování souborů
- hashování souborů
- připojení k síťovému portu s pomocí SSL/TLS
- kódování a dekódování Base64
Postupně si ukážeme, jak jednoduché je tyhle věci v řádce použít.
Jednoduchý benchmark
Začneme trochu jinde. Pokud chcete jednoduše a rychle porovnat hrubý strojový výkon dvou počítačů, OpenSSL vám k tomu pomůže svým příkazem speed
. Je následovaný hashovacím algoritmem, který chcete k testu použít. Pokud místo něj napíšete třeba help
, vypíše vám utilita všechny možnosti, které můžete použít. Zkusíme třeba sha1
.
$ openssl speed sha1 Doing sha1 for 3s on 16 size blocks: 3985754 sha1's in 2.96s Doing sha1 for 3s on 64 size blocks: 3192624 sha1's in 3.00s Doing sha1 for 3s on 256 size blocks: 1864481 sha1's in 2.98s Doing sha1 for 3s on 1024 size blocks: 693852 sha1's in 2.99s Doing sha1 for 3s on 8192 size blocks: 101811 sha1's in 2.99s OpenSSL 1.0.1c 10 May 2012 built on: Sun Jul 29 13:24:46 UTC 2012 options:bn(64,32) rc4(8x,mmx) des(ptr,risc1,16,long) aes(partial) blowfish(idx) compiler: gcc -fPIC -DOPENSSL_PIC... The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes sha1 21544.62k 68109.31k 160170.18k 237626.91k 278941.71k
Zásadní jsou poslední dva řádky se souhrnem naměřených hodnot. Jedná se o počty bajtů zpracovaných vybraným algoritmem za sekundu. Čím více, tím lépe.
Šifrování souborů
Teď už přejdeme k praktickým ukázkám, které nám opravdu k něčemu budou. Uživatelé se často ptají, jak jednoduše zašifrovat jeden soubor. Ve světe nejrozšířenějšího desktopového operačního systému se k tomu obvykle používá kompresní program RAR. My máme přímo pod nosem software, který je k tomu vytvořen.
Nejdříve zašifrujeme:
$ openssl des3 -in Tajny_obrazek.jpg -out Zasifrovano.tajne enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password:
Dvakrát zadáme stejné heslo a je to. Soubor je zašifrovaný. Po přenesení na cílové místo jej můžeme zase rozšifrovat:
$ openssl des3 -d -in Zasifrovano.tajne -out Tajny_obrazek.jpg enter des-ede3-cbc decryption password:
Jak vidíte, navíc je jen parametr -d
jako dešifrovat (decrypt). Při šifrování je ještě doporučováno heslo osolit parametrem -salt
. Komplikuje to útok na heslo hrubou silou.
Připojení k SSL serverům
Když se chcete připojit třeba k HTTP serveru, abyste odladili nějaký problém, většinou k tomu použijete telnet
. Osobně bych vám doporučil raději nc
, ale obě varianty nakonec vedou ke správném výsledku.
$ nc www.google.cz 80 GET / HTTP/1.1 Host: www.google.cz HTTP/1.1 200 OK Date: Wed, 16 Jan 2013 12:43:11 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=ISO-8859-2 ...
Co ovšem udělat ve chvíli, kdy se potřebujete takto připojit k šifrované komunikaci třeba HTTPS či SMTP s podporou SSL. V OpenSSL k tomu slouží funkce s_client
, která se chová jako SSL klient a je určena právě pro podobné testování.
$ openssl s_client -connect www.google.cz:443 CONNECTED(00000003) depth=1 C = US, O = Google Inc, CN = Google Internet Authority verify error:num=20:unable to get local issuer certificate verify return:0 --- Certificate chain 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=google.com i:/C=US/O=Google Inc/CN=Google Internet Authority 1 s:/C=US/O=Google Inc/CN=Google Internet Authority i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority --- Server certificate -----BEGIN CERTIFICATE----- MIIcFzCCG4CgAwIBAgIGR09PUAFxMA0GCSqGSIb3DQEBBQUAMEYxCzAJBgNVBAYT AlVTMRMwEQYDVQQKEwpHb29nbGUgSW5jMSIwIAYDVQQDExlHb29nbGUgSW50ZXJu ...
Jak vidíte, dostanete na obrazovku řadu debugovacích informací včetně serverového certifikátu. Nakonec je výpis oddělen třemi pomlčkami. V tu chvíli je spojení otevřeno a vy do něj můžete interaktivně psát své příkazy.
Bohužel ani v roce 2013 ještě s_client neumí komunikovat s IPv6 servery:
$ openssl s_client -connect ipv6.google.com:443 gethostbyname failure connect:errno=0
Pro takový případ doporučuji utilitu ncat
, která se chová podobně, jen nevypisuje tolik podrobných informací:
$ ncat -6 --ssl -v ipv6.google.com 443 Ncat: Version 6.00 ( http://nmap.org/ncat ) Ncat: SSL connection to 2a00:1450:4007:803::1010:443. Google Inc Ncat: SHA-1 fingerprint: 4BB7 CC81 2CB9 003A 7597 1027 4361 0B93 D97C 3C19 GET / HTTP/1.1 Host: ipv6.google.com HTTP/1.1 200 OK Date: Wed, 16 Jan 2013 12:41:13 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=ISO-8859-1 ...
Výpočet hashů
Pokud jste někdy stahovali třeba obraz instalace nějaké linuxové distribuce, byl pravděpodobně na serveru také seznam hashů jednotlivých souborů. Ty slouží ke kontrole, zda se vše stáhlo v pořádku. Po stažení byste měli z lokálního souboru vypočítat hash a zkontrolovat, zda se shoduje s údaji na serveru. Pokud ano, stáhl se každičký bit v souboru správně.
OpenSSL umí z principu také hashovat a přes svou ovládací utilitu nabízí své schopnosti i uživatelům. Hash vytvoříme jednoduše tak, že zvolíme algoritmus a v druhém parametru předáme název souboru.
$ openssl md5 xubuntu-12.10-desktop-i386.iso MD5(xubuntu-12.10-desktop-i386.iso)= bd87be6626efa4ebf7678f5e2c942b57 $ openssl sha1 xubuntu-12.10-desktop-i386.iso SHA1(xubuntu-12.10-desktop-i386.iso)= 4a791f2f60d9179915d6b397d486c0781717fc6d
Můžete si také jednoduše spočítat hashe více souborů najednou. Stačí je prohnat programem xargs
, který z jednotlivých řádek udělá parametry příkazu, který mu určíte.
$ ls *.iso |xargs openssl md5
Base64 kódování a dekódování
Určitě jste se už setkali s podobně zakódovaným souborem:
T3N0cmF2c2vDvSBzdXBlcnBvxI3DrXRhxI0gdnlsZXDFoWlsIG9kcG92xJvEjyBu YSBvdMOhemt1IMW+aXZvdGEsIHZlc23DrXJ1IGEgdsWvYmVjLiDigJ40MiwgcHnE jW/igJwK
Jde o datový formát Base64, který se používá při převodu binárních dat (rozsypaného čaje) do tisknutelných znaků. Jak vidíte, ve výše uvedeném příkladu není nic než písmena a čísla. Velikost dat ovšem naroste o třetinu. OpenSSL algoritmus obsahuje a velmi jednoduše jej můžeme použít, vlastně úplně stejně jako při šifrování souborů.
Nejprve soubor zakódujeme:
$ openssl base64 -in soubor -out zakodovano
Pak ho přeneseme a opět dekódujeme:
$ openssl base64 -d -in zakodovano -out soubor
OpenSSL toho umí daleko více, především umí digitálně podepisovat, vytvářet certifikáty, spravovat certifikační autority a podobně. Pokud projevíte zájem, můžeme příště pokračovat tímto směrem a otevřít další nástroje švýcarského nože.