Použití X.509 pro zabezpečení emailové komunikace

23. 9. 2008 21:06 (aktualizováno) bardolf

Původním záměrem bylo studium X.509 a jeho použití v Javě (email, SSL/TSL). Myslím ale, že základy použití pří běžné komunikaci standardními emailovými klienty a dále použití openssl pro použití muttu jako nadstandardního emailového klienta, upotřebí širší komunita.

Základní pojmy

Následující pojmy by měly být známy: symetrická šifra, asymetrická šifra, hashovací fce, elektronický podpis, digitální certifikát, certifikační autorita.

Praktická ukázka

Praktická ukázka demonstruje užití X.509 certifikátů bez nutné znalosti jakékoliv teorie. Jako ukázkový emailový klient byl zvolen thunderbird, dále budeme potřebovat balíček openssl. Všechny příklady byly byly poušteny na GNU/Linux (konkrétně ubuntu). Díky platformové nezávislosti thunderbirdu a existence openssl pro jiné platformy je možno všechny následující ukázky spustit i v jiných OS.

Generování podepsaných certifikátů

Alice a Bob chtějí spolu komunikovat bezpečným emailovým kanálem. Není pro ně nezbytně nutné mít ověřený certifikát některou veřejnou certifikační autoritou. Znají se a přijdou spolu osobně do kontaktu, je možné si tedy snadno vyměnit certifikáty zabezpečeným kanálem. V neposlední řadě ušetří ;-).

Nejprve si Alice vytvoří self-signed certifikační autoritu.

$ /tmp/cert2$ /usr/lib/ssl/misc/CA.pl -newca CA certificate filename (or enter to create)

Making CA certificate …
Generating a 1024 bit RSA private key
..++++++
.........................­......................++++++
writing new private key to ‚./demoCA/private/cakey.pem‘
Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:


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 Republic
Locality Name (eg, city) []:Prague
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Secret Organization
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:IT
Email Address []:

Please enter the following ‚extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
b4:da:ff:9a:d0:6b:b6:f2
Validity
Not Before: Sep 8 14:49:47 2008 GMT
Not After : Sep 8 14:49:47 2011 GMT
Subject:
countryName = CZ
stateOrProvinceName = Czech Republic
organizationName = Secret Organization
commonName = IT
X509v3 extensions:
X509v3 Subject Key Identifier:
CB:86:DE:DE:5D:BD:7C:D4:7­1:55:58:D4:2D:5C:F6:AF:8C:37:BF:09
X509v3 Authority Key Identifier:
keyid:CB:86:DE:DE:5D:BD:7C:­D4:71:55:58:D4:2D:5C:F6:AF:8C:37:BF:09
DirName:/C=CZ/ST=Czech Republic/O=Secret Organization/CN=IT
serial:B4:DA:FF:9A:D0:6B:B6:F2

X509v3 Basic Constraints:
CA:TRUE
Certificate is to be certified until Sep 8 14:49:47 2011 GMT (1095 days)

Write out database with 1 new entries Data Base Updated

Nyní si Alice a Bob každý zvlášť vytvoří požadavek na certifikát

$ /usr/lib/ssl/misc/CA.pl -newreq Generating a 1024 bit RSA private key ................................++++++ ...........++++++ writing new private key to ‚newkey.pem‘ Enter PEM pass phrase: Verifying – Enter PEM pass phrase:

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 Republic
Locality Name (eg, city) []:Prague
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Secret Organization
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Alice
Email Address []:alice.secret.org@gmail.com

Please enter the following ‚extra‘ attributes to be sent with your certificate request A challenge password []: An optional company name []: Request is in newreq.pem, private key is in newkey.pem

a podobně Bob. Ten po vygenerování postoupí požadavek (request) (obsahující veřený klíč, privátní by neměl dát z ruky) Alici k podepsání certfikační autoritou. Alice si též podepíše svůj request certifikační autoritou.

$ /usr/lib/ssl/misc/CA.pl -sign Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: b4:da:ff:9a:d0:6b:b6:f3 Validity Not Before: Sep 9 13:49:06 2008 GMT Not After : Sep 9 13:49:06 2009 GMT Subject: countryName = CZ stateOrProvinceName = Czech Republic localityName = Prague organizationName = Secret Organization commonName = Alice emailAddress = alice.secret.org@gmail.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 8E:47:B0:F8:96:ED:07:4B:0A:3C:54:AD:74:5D:A6:C0:CE:67:94:D1 X509v3 Authority Key Identifier: keyid:CB:86:DE:DE:5D:BD:7C:D4:71:55:58:D4:2D:5C:F6:AF:8C:37:BF:09

Certificate is to be certified until Sep 9 13:49:06 2009 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated Signed certificate is in newcert.pem

Výsledkem je v obou případech podepsaný certifikát. Bezpečným kanálem je třeba vyměnit certifikát certifikační autority. Důvěryhodnot osobních certifikátů Alice a Boba vyplývá z důvěryhodnosti certifikační autority.

openSSL

Alice i Bob si nyní mohou dešifrovat/šifrovat/podepisovat zprávy:

$ openssl smime -decrypt -in smime.p7m -inkey PATH_TO_PRIVATE_KEY/newkey.pem $ openssl smime -encrypt -in email.txt PATH_TO_BOBS_CERTIFICATE/newcert.pem $ openssl smime -sign -inkey PATH_TO_PRIVATE_KEY/newkey.pem -signer PATH_TO_MY_CERTIFICATE/newcert.pem -in email.txt

Lze např. šifrovat a podepisovat zároveň i odeslat

alice@pc $ openssl smime -sign -inkey PATH_TO_PRIVATE_KEY/newkey.pem -signer PATH_TO_MY_CERTIFICATE/newcert.pem -in email.txt | openssl smime -encrypt PATH_TO_BOBS_CERTIFICATE/newcert.pem > smime.p7m | sendmail

X.509 v Thunderbirdu

Alice i Bob již mají nastavené účty a jen naimportují vygenerované certifikáty a certifikační autoritu.
Nastavení certfikátů se děje Edit>Preferences>Advanced>Cer­tificates>Vew Certificates. Nejprve v záložce

Authorities importujeme vygenerovanou certfikační autoritu a zvolíme možnost důvěřovat CA pro identifikaci emailových uživatelů.

alice_authorities_a.png
alice_authorities_b.png

Dále naimportujeme vlastní PKCS#12 soubor, který v sobě udržuje symetrickou šifrou kódovaný privátní klíč doprovázený certifikátem obsahující klíč veřejný. Tento lze vytvořit příkazem:

$ openssl pkcs12 -inkey newkey.pem -in newcert.pem -out new.p12 -export

Tento soubor lze importovat v záložce Your Certificates.

alice_your_certificate.png

Dalším krokem je import certifkátů ostatních uživatelů. Tento krok je závislý na certifikační autoritě. Pokud není nalezena CA pro importovaný cerfitikát nebude z bezpečnostních důvodu import dokončen. To vše je řešeno v záložce Other People's.

alice_other_peoples.png

Posledním krokem je přiřazení certifikátu pro podepisování a šifrování danému účtu v menu Edit>Account

account_certificate.png

Alice nyní může bez nebezpečí odhalení zaslat následující email. Je třeba zvolit variantu encrypt email a sign email pro ověření identity odesílatele.

email_preview.png

Bob při přijmutí emailu zadá heslo, kterým zakódoval svůj privátní klíč a ověří si, zda jsou informace z důvěryhodného zdroje a zda nebyl email změnen od dob odeslání.

bob_received_email.png

Šifrovaný text je ve skutečnosti jako příloha souboru smime.p7m. Tento soubor je ve formátu DER, lze převést na „čitelnější“ formát PEM, který obsahuje stejná data jen myslím kódované base64.

$ openssl pkcs7 -in smime.p7m -inform DER -outform PEM -----BEGIN PKCS7----- MIIQwwYJKoZIhvcNAQcDoIIQtDCCELACAQAxggHwMIH1AgEAMF4wUTELMAkGA1UE BhMCQ1oxFzAVBgNVBAgTDkN6ZWNoIFJlcHVibGljMRwwGgYDVQQKExNTZWNyZXQg T3JnYW5pemF0aW9uMQswCQYDVQQDEwJJVAIJALTa/5rQa7bzMA0GCSqGSIb3DQEB AQUABIGAwAluLAAZyrrpmcqCcHH0GaFpxRke4ftdhJ1BXsJFxa7jgC4zWt0gLEDN . . . NH47+w03UOsTmXpk9hdgX8LPG0EqTRLY3k3BPiv8icpxOTLIRG4jZCO4LWz7oXfR u/XkPn1W2G9V9ntmLBuZM7vaPDGPMa3qexTpaS8+5DJyELjqX/dBbwhayoRDl7Ht R5riC1T/UxKQ/dtGcDHgZ43KjHhYoRUGJmrQgwVO6djARnpcJDYKG5PFW557m+Cj 9U9YcCOAjrXgHj76oWQRZc7/t8mD20U= -----END PKCS7-----

Soubor lze po stažení dekódovat

$ openssl smime -decrypt -inform DER -in smime.p7m -inkey /home/nemecm/tmp/cert2/bob/newkey.pem Enter pass phrase for /home/nemecm/tmp/cert2/bob/newkey.pem: Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="------------ms090800010001050101090507"

--------------ms090800010001050101090507
Content-Type: text/plain; charset=ISO-8859–1; format=flowed
Content-Transfer-Encoding: 7bit

Ahoj Bobe, objekt se bude nalezat v budove Nove Dvory v Durychove ulici
25. ledna 2006 kolem 8 AM. Hodne zdaru!
--------------ms090800010001050101090507
Content-Type: application/x-pkcs7-signature; name=„smime.p7s“
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=„smime.p7s“
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACA­QExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQE­HAQAAoIIFvjCC AtswggJEoAMCAQICCQC02v+a0Gu28zAN­BgkqhkiG9w0BAQUFADBRMQswCQYD­VQQGEwJDWjEX MBUGA1UECBMOQ3plY2ggUmVwdWJsaW­MxHDAaBgNVBAoTE1NlY3JldCBPcmdhbml6YX­Rpb24× . . . /5rQa7bzMA0GCSqGSIb3DQEBA­QUABIGAnJToHNOKt190VgnV54vzs27XL2WO­oGBVDWXdSgbr 4WsbnYJJfO3LqgB1TELvbfAeR/lFxSA­YLwESYFEJNNZsNqdEn29z6jrGCm/BZnym­wYkX+WT6 585yY0QrQHptw4ig­ZQIYyMWSCfsNT+yKeyc5jtfTEv­RsFnqTTtsaT61pKJoAAAAAAAA= --------------ms090800010001050101090507--

Déle je možné ověřit podpis

$ openssl smime -verify -in test.msg -signer /home/nemecm/tmp/cert2/alice/newcert.pem -CAfile /home/nemecm/tmp/cert2/demoCA/cacert.pem Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit

Ahoj Bobe, objekt se bude nalezat v budove Nove Dvory v Durychove ulici
25. ledna 2006 kolem 8 AM. Hodne zdaru!

Verification successful

Závěr

Ukázali jsme si, jak lze jednoduchým způsobem použít X.509 certifikáty, jejich podporu v emailových klientech. Další možností je použít PGP. Technologicky je PGP postaveno na stejných algoritmech asymetrického šifrování, liší se v řadě zásadních věcí, např. ve způsobu certifikace (X.509 využívá directory method, PGP referral method) atd. To je ovšem nad rámec tohoto zápisku.

Sdílet