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

Petr Krčmář 17. 1. 2013

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

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.

Našli jste v článku chybu?
DigiZone.cz: Světlé zítřky gaučových sportovců

Světlé zítřky gaučových sportovců

Lupa.cz: Zkoušeli operátoři manipulovat měření LTE?

Zkoušeli operátoři manipulovat měření LTE?

Měšec.cz: Cestujte bez starostí, získejte výhodné pojištění

Cestujte bez starostí, získejte výhodné pojištění

Root.cz: Špína v počítačích: mrtvé myši, prach a pavouci

Špína v počítačích: mrtvé myši, prach a pavouci

DigiZone.cz: Prima Max bude mít letní kino. Na střeše...

Prima Max bude mít letní kino. Na střeše...

DigiZone.cz: Noxon iRadio 1 W bude za pár měsíců

Noxon iRadio 1 W bude za pár měsíců

DigiZone.cz: Náhrada za nevrácená zařízení?

Náhrada za nevrácená zařízení?

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Měšec.cz: Od kdy musí studenti platit pojistné?

Od kdy musí studenti platit pojistné?

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...

DigiZone.cz: HbbTV KinoSvět: už jede na dalších TV

HbbTV KinoSvět: už jede na dalších TV

DigiZone.cz: Roční bonus pro Dvořáka schválen

Roční bonus pro Dvořáka schválen

DigiZone.cz: Soud zakázal šíření TV Markíza v ČR

Soud zakázal šíření TV Markíza v ČR

DigiZone.cz: Markíza: tady je předběžné opatření

Markíza: tady je předběžné opatření

DigiZone.cz: Skylink: Nova Sport volně

Skylink: Nova Sport volně

Vitalia.cz: Máte chutě? Nejezděte do světa, ale do Dobřichovic

Máte chutě? Nejezděte do světa, ale do Dobřichovic

Podnikatel.cz: Oblíbené Babišovo reverse charge. Potopilo je?

Oblíbené Babišovo reverse charge. Potopilo je?

Lupa.cz: Jaké IoT tarify nabízejí mobilní operátoři?

Jaké IoT tarify nabízejí mobilní operátoři?

DigiZone.cz: Pardubicko: Výrazně posílen Mux 3

Pardubicko: Výrazně posílen Mux 3

120na80.cz: Proč komáři létají hlavně večer?

Proč komáři létají hlavně večer?