Linux v příkazech - OpenSSL

Seriál opět pokračuje dílem, který je laděn v duchu ochrany dat.

17.9.2004 08:00 | Josef "jose" Kadlec | přečteno 36453×

Nejdříve by bylo vhodné si stručně říci, co je to SSL (Secure Sockets Layer). Je to tedy jakýsi standard, který integruje šifrování do komunikačního protokolu. OpenSSL je pak implementace nejen samotného SSL (Secure Sockets Layer). OpenSSL umožňuje spoustu dalších věcí jako šifrování a dešifrování souborů, práci s certifikáty, podpisy, náhodnými čísly, atd. OpenSSL je tvořeno knihovnou pro šifrování a autentizaci a dalšími podpůrnými programy. Tato knihovna se často používá k zabezpečování protokolů -- například HTTPs (HTTP over SSL), což je šifrovaná verze protokolu HTTP, dále například IMAPs, POP3s, SMTPs nebo IRCs. OpenSSL však není pouze knihovnou, která nám nabízí jisté API, ale také konzolovou utilitou (resp. celou sadou utilit).

Uvedu zde výčet vybraných standardních (čili těch nejdůležitějších) příkazů a jejich stručný popis. Kompletní seznam příkazů lze získat příkazem openssl s příznaky -list-standard-commands, -list-message-digest-commands a -list-cipher-commands. Tyto příkazy se používají ve tvaru openssl <prikaz> [parametry].

ca - správa certifikačních autorit (CA)
crl - správa revokačních certifikátů (CRL)
crl2pkcs7 - konverze CRL na PKCS#7
dsa - práce s DSA klíči
dsaparam - generování a manipulace s DSA
enc - manipulace se symetrickými šiframi
dhparam - správa Diffie-Hellman parametrů
gendsa - generování DSA parametrů
genrsa - generování RSA parametrů
ocsp - poskytne různorodé informace o certifikátu
passwd - generování hashovaných hesel
pkcs12 - správa pkcs12 certifikátů
pkcs7 - správa pkcs7 certifikátů
rand - generování pseudonáhodných čísel
req - generování certifikátů
rsa - správa RSA dat
rsautl - utilita pro podepisování, ověřování, šifrování a dešifrování pomocí RSA
s_client - vytvoření SSL/TLS spojení ke vzdálenému serveru
s_server - server bude čekat na SSL/TLS spojení od klientů
s_time - SSL časovač
sess_id - správa SSL sessions
speed - měření rychlosti algoritmu
verify - ověřování X.509 certifikátů
version - informace o verzi OpenSSL
x509 - správa X.509 certifikátů

Hned si ukážeme příklad a tím bude zašifrování a dešifrování souboru pomocí příkazu enc.


bash-2.05b$ openssl enc -des3 -salt -in blah.txt -out blah.des3
enter des-ede3-cbc encryption password:<heslo>
Verifying - enter des-ede3-cbc encryption password:<ověření hesla>

Zašifrovali jsme soubor blah.txt tří klíčovou šifrou triple DES s výstupem do souboru blah.des3. Rozšifrování tohoto souboru realizujeme takto:


bash-2.05b$ openssl enc -des3 -d -salt -in blah.des3 -out blah.txt -k blemc

"blemc" je heslo, kterým jsme soubor šifrovali. Pokud tento přepínač nezadáme, budeme na heslo dotázáni a to je i bezpečnejší varianta, kterou se chráníte proti tomu, že by vaše heslo někdo přečetl ve výpisu procesů (např. v ps).

SSL spojení dvou subjektů funguje tak, že se vytvoří klasické TCP spojení, dále tzv. handshake, při kterém se ověří certifikáty a vymění se šifrovací klíče. Poté už se začnou posílat zašifrovaná data.

K ověření identity se používají tzv. certifikáty. Mohou sloužit i pro ověřování osob. V našem smyslu ovšem certifikát slouží k ochraně klientů, kteří se přihlašují na servery. Certifikát klientům zaručí, že server, ke kterému se připojí, není nějak podvržený (tzn. ovládá ho "vetřelec").

Ano, to už je trochu konkrétnější příklad použití - účelem je snadnější pochopení dané problematiky. K přesměrování provozu mohl útočník použít například ARP poisoning nebo DNS přesměrování. Pravost certifikátů je podložena podpisem. Může být podepsán sám sebou (tzv. self-signed certificate) nebo tzv. CA (Certificate Authority). Certifikát CA může být podepsán další certifikační autoritou (pozn.: jako CA působí v ČR například CESNET. U této CA si mohou, po předložení dokladu totožnosti, nechat vytvořit certifikát zaměstnanci a studenti ČVUT zdarma :-) Bohužel CESNET není ověřenou certifikační autoritou, takže tento certifikát zatím například ve státní správě neuplatníte.).

Tyto certifikáty jsou umístěny v uživatelských aplikacích (např. v internetových prohlížečích) a jsou to certifikáty, kterým uživatel důvěřuje. Podepsání certifikátu certifikační autoritou, které uživatel věří, mu garantuje to, že je daný certifikát pravý (autentický). Tato vlastnost se dále dědí, takže certifikát podepsaný tímto autentickým certifikátem je též pravý. Certifikát obsahuje CN (Common Name), což je jméno toho, koho certifikát identifikuje. Dále platnost -- počáteční a koncové datum platnosti. Platnost může být předčasně ukončena zveřejněním v tzv. CRL (Certificate Revocation List). Dále také veřejný klíč, kterým se šifruje a některé další údaje pro samotné SSL nepodstatné jako například jméno, e-mail, adresa toho, komu byl certifikát vydán.

Pro šifrování se používá metoda založená na výměně klíčů - stejný princip jako např. u GnuPG. Ovšem klíče zde slouží pouze pro navázání spojení. Poté se strany dohodnou na symetrickém klíči, kterým šifrují. Je to podstatně rychlejší, než kdyby se celý přenos šifroval asymetricky. Jenom bych chtěl upozornit na to, že zde je výhodnější používat soukromé klíče bez hesla, jinak bude nutná lidská asistence například při restartování HTTP serveru.

Nyní předvedu, jak můžete jednoduše vygenerovat x509 certifikát. Použijeme příkaz openssl v tomto tvaru:

bash-2.05b$ openssl req -new -x509 -nodes -out cert.pem \
-keyout key.pem -days 1098
Generating a 1024 bit RSA private key
..........++++++
.....++++++
writing new private key to 'key.pem'
-----
You are about to be asked to enter information that will
be incorporated into your certificate request.
What you are about to enter is what is called a 
Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CZ
State or Province Name (full name) [Some-State]:Czech Rep.
Locality Name (eg, city) []:Prague
Organization Name(eg, company)[Internet Widgits Pty Ltd]:CVUT
Organizational Unit Name (eg, section) []:FJFI
Common Name (eg, YOUR name) []:Josef Kadlec
Email Address []:jose@czslug.cz

Příznak -req značí, že se jedná o certifikační žádost. Příznak -new znamená, že vytváříme novou žádost. Příznak -x509 znamená právě vytváření certifikátu podepsaného sám sebou (self-signed certificate). Příznakem -nodes říkáme, aby se soukromý klíč nešifroval. Certifikát bude zapsán do souboru cert.pem a klíč do souboru key.pem v aktuálním adresáři. Certifikát bude platný 1098 dní (3 roky). Budete dotázáni, abyste vyplnili zbývající informace jako e-mail, adresa a také CN, kam by jste měli vyplnit jméno serveru, pro který je certifikát vystaven. Soubory cert.pem a key.pem jsou při běžném čtení nečitelné (pokud neuvedeme příznak -text).

Do lidsky čitelné podoby je lze převést takto:

bash-2.05b$ openssl x509 -in cert.pem -text 
Certificate:
Data:
  Version: 3 (0x2)
  Serial Number: 0 (0x0)
  Signature Algorithm: md5WithRSAEncryption
  Issuer: C=CZ, ST=Czech Rep., L=Prague, O=CVUT, OU=FJFI,
CN=Josef Kadlec/emailAddress=josef.kadlec@czslug.cz
  Validity
      Not Before: Sep  2 18:56:40 2004 GMT
      Not After : Sep  5 18:56:40 2007 GMT
  Subject: C=CZ, ST=Czech Rep., L=Prague, O=CVUT, OU=FJFI,
CN=Josef Kadlec/emailAddress=josef.kadlec@czslug.cz
  Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
      RSA Public Key: (1024 bit)
          Modulus (1024 bit):
              00:ad:94:b4:e8:ff:e9:95:bf:94:c6:28:5d:01:f8:
              07:43:b7:c3:30:02:cb:5b:d5:5a:d9:46:bf:89:e0:
              37:ee:ac:06:94:0e:33:10:15:46:53:91:55:d8:e3:
              b8:1c:8f:a4:cd:ab:33:01:81:67:94:94:bb:27:ea:
              7d:f6:d7:93:dd:a0:93:6c:4d:05:16:6a:03:1d:95:
              4b:f8:1d:b0:a9:15:a8:1f:81:64:5f:a3:da:dc:56:
              a9:44:5f:f7:b5:97:03:7b:ff:e9:74:0a:a3:5c:d1:
              ed:87:35:18:90:9f:75:b9:b6:ac:63:e9:e1:96:a0:
              90:3f:2a:09:d3:cf:a2:e8:c7
          Exponent: 65537 (0x10001)
  X509v3 extensions:
      X509v3 Subject Key Identifier: 
          CD:F1:DB:E5:3D:16:A8:EC:85:78:13:CC:E6:
          4A:BB:E6:CD:C9:95:69
      X509v3 Authority Key Identifier: 
          keyid:CD:F1:DB:E5:3D:16:A8:EC:85:78:13:
          CC:E6:4A:BB:E6:CD:C9:95:69
          DirName:/C=CZ/ST=Czech Rep./L=Prague/O=
          CVUT/OU=FJFI/CN=Josef
Kadlec/emailAddress=josef.kadlec@czslug.cz
          serial:00

       X509v3 Basic Constraints: 
          CA:TRUE
Signature Algorithm: md5WithRSAEncryption
    12:c4:f7:3d:c9:34:5f:b2:6f:ef:10:08:20:35:c6:00:c0:26:
    b3:d6:8a:2e:a0:5f:c5:bf:ba:7e:c1:fd:7f:f6:ad:68:47:58:
    fb:72:1b:37:3f:17:79:46:d2:01:fb:bb:a2:fb:f8:34:48:ef:
    7e:1a:c2:e7:64:1c:05:23:ee:e9:d6:15:88:42:10:68:d5:2c:
    cf:c0:48:a0:46:33:bc:36:c4:6b:d4:4c:04:6f:32:d0:a9:c6:
    e3:b1:d6:7a:44:bc:05:0d:2e:94:87:ec:12:45:b7:55:c1:03:
    75:de:27:b3:0e:62:f5:6c:5d:5d:1c:d3:c6:cd:73:ea:1b:89:
    8f:7f
-----BEGIN CERTIFICATE-----
MIIDhjCCAu+gAwIBAgIBADANBgkqhkiG4w0BAQQFADCBjzELMAkGS1UEBhMCQ1Ix
[...]

a
bash-2.05b$ openssl rsa -in key.pem -text
Private-Key: (1024 bit)
modulus:
    00:ad:94:b4:e8:ff:e9:95:bf:94:c6:28:5d:01:f8:
    07:43:b7:c3:30:02:cb:5b:d5:5a:d9:46:bf:89:e0:
    37:ee:ac:06:94:0e:33:10:15:46:53:91:55:d8:e3:
    b8:1c:8f:a4:cd:ab:33:01:82:67:94:94:bb:27:ea:
    7d:f6:d7:97:dd:a0:93:6c:4d:05:16:6a:02:1d:95:
    4b:f8:1d:b0:a9:15:a8:1f:81:64:5f:a3:da:dc:56:
    a9:44:5f:f7:b5:97:03:7b:ff:e9:74:0a:a3:5c:d1:
    ed:87:35:18:90:9f:75:b9:b6:ac:63:e9:e1:96:a0:
    90:3f:2a:09:d3:cf:a2:e8:c7
publicExponent: 65537 (0x10001)
privateExponent:
    7b:e5:5a:c3:bc:76:43:b6:bd:40:3b:6b:37:8e:8b:
    d0:e0:07:67:eb:76:af:93:b8:06:c2:22:d1:0c:c3:
    9f:8e:16:1b:f3:8e:aa:fa:24:3a:5d:90:43:01:37:
    56:db:88:ac:6c:78:39:a8:de:00:05:b1:18:aa:9d:
    42:65:5c:35:5e:0c:86:ff:e7:fa:61:d7:88:7f:58:
    eb:ec:9b:85:29:7b:1c:79:fc:43:12:1c:b7:ec:2e:
    a5:b6:e1:8f:46:2b:ed:7d:2d:52:66:9b:71:5a:c9:
    f4:7b:05:c7:91:c4:ac:a8:b8:8c:60:a4:73:ac:d8:
    04:3a:0e:9a:5f:72:3d:f1
prime1:
    00:d2:e1:9f:51:ba:10:c2:ed:d4:97:76:f1:22:fd:
    3d:bd:9a:ab:a3:9d:3a:e5:be:42:6f:ff:2e:97:d9:
    10:ec:f5:69:04:f0:38:b9:d0:6b:51:e8:c9:33:2a:
    6a:f4:a1:06:84:3e:9b:1f:5b:88:92:09:55:fb:0c:
    d5:c2:58:6b:43
prime2:
    00:d2:b8:11:0f:21:ac:b0:a9:8e:34:73:d3:6d:ef:
    a9:e1:48:8e:bb:27:61:41:d9:c4:a2:f6:e9:2b:d3:
    16:3b:fe:45:5d:d6:91:f8:5d:84:10:3c:df:b1:1e:
    9c:19:1d:51:df:e2:34:22:e1:72:51:d7:a6:0b:69:
    53:a7:ab:da:2d
exponent1:
    13:fb:71:1f:4b:64:3f:34:4e:0a:b4:28:91:4a:31:
    c9:7f:98:77:fe:74:10:45:01:3b:65:80:c2:be:bc:
    cd:d7:4b:46:3e:85:01:86:70:44:e8:ab:f7:ff:32:
    f7:4f:32:d0:e1:25:cd:c8:dc:9e:09:e8:6d:cb:7f:
    8d:d4:d7:05
exponent2:
    00:bd:74:06:ca:6f:01:5f:b8:a2:85:60:5a:08:ee:
    c0:f3:2f:14:3d:0a:93:f3:eb:c2:52:ae:e2:47:a7:
    ba:c6:e7:bf:20:36:69:f9:3e:a7:57:bf:13:73:a0:
    cc:c1:fb:cd:80:18:55:bd:c2:aa:d1:10:ad:56:77:
    35:62:7c:2d:65
coefficient:
    45:18:af:f5:23:f1:9f:9c:5c:95:d9:65:51:dd:70:
    1c:12:32:62:27:30:d6:6d:c2:f3:b7:64:a5:f1:73:
    9b:ad:85:cc:e9:5d:cd:ae:80:5f:69:86:f0:43:d3:
    ba:3a:01:33:07:e5:3e:aa:e7:c5:a3:51:e4:41:95:
    68:49:03:d6
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCtlLTo/+mVv5TGKF0B+AdDt8MwAstb1VrZRr+J4GfuwAaUDjMQ
[...]

Některé aplikace požadují certifikát a klíč v jednom souboru. Toho lze docílit jednoduchým spojením:

cat cert.pem key.pem > cert_key.pem

Konfigurační soubor OpenSSL se nachází většinou v /etc/ssl/ a jmenuje se openssl.cnf nebo openssl.conf.

Pokud chceme, aby klienti nebyli otravováni hlášením o nedůvěryhodných certifikátech, je optimální si vytvořit vlastní CA. Po vygenerování našeho certifikátu je nutné jej naimportovat do počítačů, které hodlají s naším serverem komunikovat. My jako CA poté můžeme generovat certifikáty, které budou již pro klienty důvěryhodné. Lze využít i veřejných (či oficiálních) CA, u kterých lze nechat certifikáty podepsat.

Pokud chceme vygenerovat certifikát CA, je nejprve nutné vytvořit adresář pro CA - direktiva dir (implicitně demoCA) v konfiguračním souboru pro OpenSSL. Dále vytvoříme další nutné podadresáře (implicitně certs, crl, newcerts a private) podle konfiguračního souboru pro OpenSSL. Do adresáře pro CA je potřeba vytvořit soubor index.txt, což je jakýsi "database index file". V tom samém adresáři je nutné vytvořit soubor serial, do kterého je nutné napsat hodnotu "01".

Dále se podíváme, jak bude vypadat část konfiguračního souboru pro OpenSSL (openssl.cnf). Část tohoto souboru, která se týká CA, by mohla vypadat tedy takto:



[ ca ]
default_ca	= CA_default		# odkaz na sekci

[ CA_default ]

dir		= /opt/openssl		# root adresar
certs		= $dir/certs		# adresarova struktura
crl_dir		= $dir/crl			# CRL
database		= $dir/index.txt		# index soubor
new_certs_dir	= $dir/newcerts		# nove certifikaty

certificate	= $dir/private/CAcert.pem 	# CA certifikat
serial		= $dir/serial 		# poradove cislo certifikatu
crl		= $dir/clr/crl.pem 		# soucasny CRL
private_key	= $dir/private/CAkey.pem	# privatni klic CA
RANDFILE     = $dir/private/.rand	# soubor pro nahodna cilsla

x509_extensions		= x509v3_extensions	# sekce pro x509
default_days		= 365		# jak dlouho plati
default_crl_days= 30			# jak dlouho pred novym CRL
default_md	= md5			# jakou md pouzit
preserve	= no			# DN trideni

policy		= policy_match		# odkaz na zabezpeceni


K vytvoření samotné CA se používá příkaz req (přesněji s přepínačem -x509).


bash-2.05b$ openssl req -new -x509 -keyout $./private/CAkey.pem \
-out ./private/CAcert.pem  -config ./openssl.cnf


Using configuration from ./openssl.cnf
Generating a 512 bit private key
writing new private key to './private/CAkey.pem'
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorperated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CZ
State or Province Name (full name) [Some-State]:Czech Rep.
Locality Name (eg, city) []:Prague
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CVUT
Organizational Unit Name (eg, section) []:FJFI
Common Name (eg, YOUR name) []:Josef Kadlec
Email Address []:josef.kadlec@czslug.cz

Jako CA můžeme certifikát podepsat příkazem:

openssl ca -in request.pem -out cert.pem

Tímto se změní některé soubory, které jsme vytvářeli při zakládání CA. Je to z toho důvodu, že CA si udržuje databázi podepsaných certifikátů.

Pokud chceme zabezpečit jednotlivé protokoly (IMAPs, HTTPs, atd.) je potřeba to samotnému serveru (v případě HTTP například Apache) sdělit. Server musí vědět odkud má certifikát a klíč číst. Tuto funkci musí samozřejmě server podporovat. V případě serveru Apache k této činnosti slouží mod_ssl. Ověření funkčnosti takového serveru můžeme provést příkazem:

openssl s_client -connect server.cz:https

Opět samozřejmě odkáži na další reservoár informací a to konkrétně na dokumentaci k OpenSSL, která je dostupná na http://www.openssl.org/docs/.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=389