OpenSSL: švýcarský nůž nejen k šifrování

17. 1. 2013
Doba čtení: 5 minut

Sdílet

OpenSSL má ve své distribuci nainstalovaný každý. Je to univerzální knihovna pro šifrování všeho druhu, kterou využívá ve vašem systému mnoho programů. Má ale také řádkovou variantu, která zvládá totéž a umožňuje vám šifrovat soubory, spojení se serverem a další akce. Některé si společně ukážeme.

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ů.

bitcoin_skoleni

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.

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.