OpenSSL
Sissejuhatus
OpenSSL http://www.openssl.org/ on vaba tarkvaraline Secure Sockets Layer (SSL v2/v3) ja Transport Layer Security (TLS v1) protokollide implementatsioon. OpenSSL tarkvara sisaldab nii utiliite kui teeke, mis sobivad nt erinevates programmeerimiskeeltes OpenSSL funktsionaalsuse kasutamiseks.
Tänapäeval on OpenSSL iseseisev tarkava, kusjuures ta põhineb Eric A. Young ja Tim J. Hudson poolt arendatud SSLeay teegil.
OpenSSL hetkel kasutusel olevat versiooni näeb käsuga
# openssl version OpenSSL 0.9.8n 24 Mar 2010
Kontrollsummade arvutamine
- SHA1
$ openssl dgst -sha1 /etc/fstab SHA1(/etc/fstab)= d3e23e40e9dcefcba35052dfdca2ba2bdcfba2eb
- MD5
$ openssl dgst -md5 /etc/fstab MD5(/etc/fstab)= 88d91737675acdb76fd5777f1a45400a
Andmete krüptimine
Sümmeetrilise võtmega
- base64, kusjuures tegu on nö teisendusega, mitte krüptimisega, echo -n ütleb mitte lisada reavahetust tulemuse lõppu
$ echo "Loomaaed" | openssl enc -base64 TG9vbWFhZWQK $ echo TG9vbWFhZWQK | openssl enc -base64 -d Loomaaed
- AES - ascii kujul
$ openssl enc -aes-256-cbc -a -salt -in /etc/fstab -out /tmp/fstab.crypted enter aes-256-cbc encryption password: Verifying - enter aes-256-cbc encryption password: $ openssl enc -d -aes-256-cbc -a -in /tmp/fstab.crypted -out /tmp/fstab enter aes-256-cbc decryption password:
- DES3 - binary kujul
$ openssl enc -des3 -salt -in fail -out fail.crypted sisesta parool $ openssl enc -d -des3 -salt -in fail.crypted -out fail.uus sisesta parool
Avaliku võtmega
Moodustatakse salajane võti (mis sisaldab ka avalikku osa)
$ openssl genrsa -out private.pem 2048
Eraldatakse avalik osa
$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
Moodustatakse krüptitav fail ning krüptitakse
$ echo 'kryptitav tekst' > file.txt $ openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl
Krüptitakse lahti, st tagasi esialgsele kujule
$ openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt
Sertifikaadipäringu moodustamine
Sõltuvalt vajadustest võib kasutada avalikku teenust pakkuva PKI asutuse teenuseid, moodustada ise oma PKI (nt tarkvara TinyCA abil, http://tinyca.sm-zone.net/) või lihtsalt genereerida sama veebiserveri sertifikaadile vastava salajase võtmega allkirjastatud veebiserveri sertifikaat - endasigneeritud sertifikaat (ingl. k. self-signed certificate)
Sertifikaadipäringu moodustamine koos privaatse võtme genereerimisega
Sertifikaadipäringu moodustamine koos privaatse võtme genereerimisega, interaktiivselt
$ openssl req -nodes -sha256 -new -keyout www.loomaaed.tartu.ee.key -newkey rsa:2048 > www.loomaaed.tartu.ee.csr ... Country Name (2 letter code) [AU]: EE State or Province Name (full name) [Some-State]: Tartu Locality Name (eg, city) []:Tartu Organization Name (eg, company) [Internet Widgits Pty Ltd]: Tartu Loomaaed Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []: www.loomaaed.tartu.ee Email Address []:
kus
- CN - common name, peab langema kokku selle teenuse aadressis kasutatava domeenimega, kus sertifikaati kasutama kavatsetakse hakata
- parooli küsimusele vastata Enteriga.
- -sha256 - uuemal ajal vaikimisi või siis näidata selleks, et tekiks selline tulemus
$ openssl req -in www.loomaaed.tartu.ee.csr -noout -text | grep sha256 Signature Algorithm: sha256WithRSAEncryption
Sama, aga mitte-interaktiivselt
$ openssl req -new -newkey rsa:2048 -sha256 -nodes -out www4.moraal.ee.csr -keyout www4.moraal.ee.key -subj "/C=EE/L=Tartu/O=Moraal AS/OU=MoraalYksus/CN=www4.moraal.ee"
Sertifikaadipäringu moodustamine olemasolevale privaatse võtmele
Teine levinud viis sertifikaadipäringu moodustamiseks on nö olemasoleva salajase võtme abi, st võti ja päringu tekitatakse eraldi sammudena
$ openssl genrsa -out key.pem 1024 $ openssl req -nodes -new -key key.pem -out req.pem -subj "/C=EE/ST=Tartumaa/L=Tartu/O=Moraal OY/OU=SGW/CN=tseeenn"
Endasigneeritud sertifikaadi moodustamine
Endasigneeritud (ingl. k. self-signed) sertifikaadi tekitamiseks sobib öelda
$ openssl x509 -req -days 3650 -in www.loomaaed.tartu.ee.csr -signkey www.loomaaed.tartu.ee.key \ -out www.loomaaed.tartu.ee.crt
Moodustatud sertifikaadi sisu saab esitada öeldes
$ openssl x509 -in www.loomaaed.tartu.ee.crt -noout -text
Wildcard sertifikaadipäringu moodustamine
Wildcard sertifikaat erineb nö tavalisest sertifikaadist selle poolest, et CN väärtuseks ei ole üks konkreetne domeeninimi, vaid nt
CN=*.loomaaed.tartu.ee
mis tabab kõiki neljanda taseme nimesid, nt mail.loomaaed.tartu.ee, www.loomaaed.tartu.ee jne, aga mitte pop3.mail.loomaaed.tartu.ee.
Sertfikaadi moodustamiseks sobib öelda nt
TODO
Avaliku võtme eraldamine sertifikaatist
$ openssl x509 -in fail.crt -pubkey -noout -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsMdo3pDBDWerlJtKFZX/ olDSCmZpVrBr2mdc/mspmDCC2a7YsjNVXtPKbqE1z1HLY6QZr3ytsgfQyhnkvMC/ eo6UvXatp2bYijgSaDwhPdzSFFsKH8SZfbHdmFF1DswZBRiXuRNrW0MoPOd6qyEs Tu/Gb1BB9bZJoybe1LBTx2gqpDrcgkEJuTD3fZfRB9madOPXsVBxGrage82HT/YQ C/ByFdDkFnbDqINPs6ax4uUdZmciBhZ9mH6uG9iqMyEFacdgk7JPFFNU95PiJzgM ZuTb3GOYU6+muIyYYv8bVF/WYIGqu7YqLPn/zD9b2nAAZoLcnxjPk3we0pdk9uyz lwIDAQAB -----END PUBLIC KEY-----
Avaliku võtme eraldamine privaatsest võtmest
Olemasolevast privaatsest võtmest saab praktiliselt (aga mitte ideeliselt!) eraldada avaliku võtme
$ openssl rsa -in private.key -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsMdo3pDBDWerlJtKFZX/ olDSCmZpVrBr2mdc/mspmDCC2a7YsjNVXtPKbqE1z1HLY6QZr3ytsgfQyhnkvMC/ eo6UvXatp2bYijgSaDwhPdzSFFsKH8SZfbHdmFF1DswZBRiXuRNrW0MoPOd6qyEs Tu/Gb1BB9bZJoybe1LBTx2gqpDrcgkEJuTD3fZfRB9madOPXsVBxGrage82HT/YQ C/ByFdDkFnbDqINPs6ax4uUdZmciBhZ9mH6uG9iqMyEFacdgk7JPFFNU95PiJzgM ZuTb3GOYU6+muIyYYv8bVF/WYIGqu7YqLPn/zD9b2nAAZoLcnxjPk3we0pdk9uyz lwIDAQAB -----END PUBLIC KEY-----
Seejuures tuleb tähele panna, et eraldada saab avaliku võtme, aga mitte sertfikaadi.
Avaliku võtme omadust küsimine
$ openssl rsa -pubin -in /tmp/gmail.com -noout -text
Šiffrid
$ openssl ciphers -v 'HIGH:MEDIUM:!ADH:!SSLv2' DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 DHE-DSS-AES256-SHA SSLv3 Kx=DH Au=DSS Enc=AES(256) Mac=SHA1 AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 DHE-DSS-AES128-SHA SSLv3 Kx=DH Au=DSS Enc=AES(128) Mac=SHA1 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 EDH-RSA-DES-CBC3-SHA SSLv3 Kx=DH Au=RSA Enc=3DES(168) Mac=SHA1 EDH-DSS-DES-CBC3-SHA SSLv3 Kx=DH Au=DSS Enc=3DES(168) Mac=SHA1 DES-CBC3-SHA SSLv3 Kx=RSA Au=RSA Enc=3DES(168) Mac=SHA1 RC4-SHA SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=SHA1 RC4-MD5 SSLv3 Kx=RSA Au=RSA Enc=RC4(128) Mac=MD5
TLSv1
Klient
TLS serveri poole pöördumiseks on vajalik serveri sertifikaadi välja andnud CA juursertifikaat
$ openssl s_client -CAfile serveri-serdi-ca-juur.pem -connect www.loomaaed.tartu.ee:9000 -showcerts -tls1
kus
- -CAfile serveri-serdi-ca-juur.pem
- -connect www.loomaaed.tartu.ee:9000 - ühendutakse aadressil www.loomaaed.tartu.ee:9000/tcp
- -showcerts - klient esitab kõik serveri poolt esitatud sertifikaadid
- -tls1 - klient kasutab tls1 protokolli
Üldiselt tuleb s_client kasutamisel näidata issueride path, nt
$ openssl s_client -CApath /etc/ssl/certs -connect www.loomaaed.tartu.ee:9000 -showcerts -tls1
Server
TLS serveri käivitamiseks on vajalik sert.pem failis ahel sertifikaate + salajane võti
$ openssl s_server -accept 9000 -CAfile ahel.pem -cert www.loomaaed.tartu.ee.crt -key www.loomaaed.tartu.ee.key -WWW -tls1
kus
- -accept 9000 - server võtab vastu päringuid pordil 9000/tcp
- -CAfile ahel.pem - serveri sertifikaadi välja andnud CA ülespoole jäävad serdid
- -cert sert.crt - serveri sertifikaat (sisaldab avalikku võtit)
- -key key - serveri sertifikaadi salajane võti
- -WWW - serveerib faile sellest kataloogist kus protsess käivitati
- -tls1 - kasutab klientidega suhtlemiseks TLS1 protokolli ja ainult seda
OSCP
Klient
TODO
Server
TODO
Kasulikud lisamaterjalid
Süsteemi koormustest
openssl utiliidi abils saab teha süsteemile koormustesti, nt kasutades RSA algoritmi
$ openssl speed rsa -multi 4 ... timing function used: sign verify sign/s verify/s rsa 512 bits 0.000100s 0.000008s 9981.7 126197.5 rsa 1024 bits 0.000462s 0.000020s 2162.9 49540.8 rsa 2048 bits 0.002469s 0.000062s 405.0 16227.5 rsa 4096 bits 0.015087s 0.000204s 66.3 4908.0
kus
- rsa -
- multi 4 - käivitatakse kõrvuti neli openssl protsessi
Parooli räsi arvutamine
man -l /usr/share/man/man1/passwd.1ssl.gz
$ openssl passwd -1 -salt FuuD4O1n parool $1$FuuD4O1n$C5GFPLbrf4acwHd8new5
PKCS#12
PKCS#12 (ingl. k. public-key cryptography standards) faili omaduste esitamiseks sobib öelda
$ openssl pkcs12 -in failinimi.p12 -info -noout Enter Import Password: MAC Iteration 1024 MAC verified OK PKCS7 Data Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 1024 PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024 Certificate bag Certificate bag
PKCS#12 faili moodustamiseks sobib öelda
$ openssl pkcs12 -export -in file.pem -out file.p12
PEM failide moodustamiseks
$ openssl pkcs12 -in file.p12 -out file.pem -nodes
keytool abil töötamine, sisu esitamine
$ keytool -list -v -keystore tc_truststore.p12 -storepass xxx | grep yyy
sertifikaadi lisamine
$ keytool -importcert -file pgsqlha.test.moraal.ee.crt -alias pgsqlha.test.moraal.ee -noprompt -keystore tc_truststore.p12
base64 teisendus
$ base64 -w 0 tc_truststore.p12 > tc_truststore.p12.b64
JKS
JSK teisendamine PKCS12 formaati
$ keytool -importkeystore -srckeystore file.jks -destkeystore file.pkcs12 -srcstoretype JKS -deststoretype PKCS12 -deststorepass 'parool'
PFX kasutamine
Aadressil https://www.digicert.com/ssl-support/pfx-import-export-iis-7.htm kirjeldatakse kuidas exportida Windows serverist PFX (Personal Information Exchange) formaadis ahelat-sertifikaati-privaatvõtit. Tulemusena tekib üks .pfx laiendiga fail, millest saab komponendid eraldada. Nt privaatse võtme eraldamiseks sobib öelda, kuna PFX on reeglina parooliga kaitstud, tuleb sisestada seejuures korrektne parool
$ openssl pkcs12 -in rakendusserver.pfx -nocerts -out key.pem -nodes Enter Import Password: MAC verified OK $ ls -l total 12 -rw-r--r-- 1 imre imre 5715 Feb 19 20:47 rakendusserver.pfx -rw-r--r-- 1 imre imre 1993 Feb 19 20:50 key.pem
Sertifikaatide eraldamiseks sobib öelda
$ openssl pkcs12 -in rakendusserver.pfx -nokeys -out cert.pem
Sarnaselt tegutsedes saab tulemusena kõige nö ehedamal kujul st eraldi failides ja pem kodeeringus esinevad (ning neid edaspidi kasutada nii nagu tarvis)
- ahel
- sertifikaat
- privaatne võti
Privaatset võtit, sertifikaati ja ahelat sisaldava PFX moodustamine
$ openssl pkcs12 -export -out imool-20150223.pfx -inkey private-key.pem -in imool-cert.pem -certfile godaddy-bundle.pem
Sertifikaati ja ahelat sisaldava PFX moodustamine
$ openssl pkcs12 -export -out imool-20150223.pfx -in imool-cert.pem -certfile godaddy-bundle.pem -nokeys
Sertifikaadi kehtivuse kontrollimine OCSP serveri abil
OCSP abil on levinud kontrollida
- kliendisertifikaati
- veebiserveri sertifikaati
Kliendisertifikaadi kontrollimine
Sertifikaadi kehtivuse kontrollimiseks OCSP serveri abil sobib öelda
# openssl ocsp -VAfile OCSP_RESPONDER.pem -issuer sk-esteid2007.pem -cert imreoolberg.pem -url http://ocsp.sk.ee -resp_text
või
# openssl ocsp -VAfile SK_OCSP_RESPONDER_2011.pem.cer -issuer ESTEID-SK_2011.pem.crt -cert imre.pub -url http://62.65.42.42 Response verify OK imre.pub: good This Update: Feb 18 12:14:19 2015 GMT
kus
- -VAfile - ocsp vastuse enda valideerimiseks vajalik sertifikaat
- -issuer - kasutaja sertifikaadi väljastaja sertifikaat
- -cert - kasutaja sertifikaat, mida kontrollitakse
- -url - oscp teenuse aadress
Veebiserveri sertifikaadi kontrollimine
kehtiva sertifikaadi puhul
$ openssl ocsp -no_cert_verify -issuer godaddy-intermediate-cert.pem -cert uk.godaddy.com.cert -url http://ocsp.godaddy.com/ WARNING: no nonce in response Response verify OK uk.godaddy.com.cert: good This Update: Feb 23 07:06:15 2015 GMT Next Update: Feb 24 19:06:15 2015 GMT
kehtetuks kuulutatud sertifikaadi puhul
$ openssl ocsp -no_cert_verify -issuer godaddy-intermediate-cert.pem -cert imool-cert.pem -url http://ocsp.godaddy.com/ WARNING: no nonce in response Response verify OK imool-cert.pem: revoked This Update: Feb 23 07:08:50 2015 GMT Next Update: Feb 24 19:08:50 2015 GMT Reason: cessationOfOperation Revocation Time: Feb 21 16:31:09 2015 GMT
DER-PEM teisendused
DER formaadis sertifikaadi teisendamiseks PEM formaati sobib öelda
$ openssl x509 -inform DER -outform PEM -in peerCert.der -out peerCert.pem
Kusjuures praktiliselt on PEM (Privacy Enhanced Mail) base64 teisendatud DER
$ cat peerCert.pem | openssl enc -base64 -d > peerCert.pem-unbased $ openssl x509 -in peerCert.pem-unbased -inform der -noout -text
Märkused
- random number genereerimise kiirendamiseks
# apt-get install rng-tools # systemctl status rng-tools
tulemuse testimiseks
# dd if=/dev/random of=/dev/null bs=1024 count=1 iflag=fullblock
kasutamiseks
# openssl dhparam -out dhparam.pem 4096
- sertifikaadi sõrmejälje (ingl. k. fingerprint, thumbprint) küsimiseks, kas md5 või sha1
$ openssl x509 -sha1 -in failinimi.crt -noout -fingerprint SHA1 Fingerprint=48:16:BC:79:F5:A0:27:4C:2B:D3:37:2F:EC:59:23:64:05:D6:69:2B
$ openssl x509 -md5 -in failinimi.crt -noout -fingerprint MD5 Fingerprint=C8:C1:08:25:EB:1F:0D:FE:D8:83:D4:CD:6F:C8:1A:DA
- RSA privaatse võtme, sertifikaadi ja sertifikaadi taotluse klappimise kontrolliks sobib öelda
# openssl x509 -in /etc/ssl/certs/cyrus-imap.pem -noout -modulus | md5sum 0dbf4513a3ecf45d64fff50776c1d1ad - # openssl rsa -in /etc/ssl/private/cyrus-imap.key -noout -modulus | md5sum 0dbf4513a3ecf45d64fff50776c1d1ad - # openssl req -in /etc/ssl/private/cyrus-imap.csr -noout -modulus | md5sum 0dbf4513a3ecf45d64fff50776c1d1ad -
- ECC privaatse võtme, sertifikaadi ja sertifikaadi taotluse klappimise kontrolliks sobib öelda, ja võrrelda tulemust
$ openssl x509 -in pveproxy-ssl.pem -noout -pubkey -----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEV0e3gu9H78c5d2b//YLrJ7E3tsavYCec PQldagXYqIB058fk+AKYdVpOA4tSoVzXeLTUyIv6w3mpujrD812A0eSv1EaAn+iQ KiCJ9+1o1Jy+5fQLXguSAiO8qpZKgfN8 -----END PUBLIC KEY----- $ openssl pkey -in pveproxy-ssl.key -pubout -----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEV0e3gu9H78c5d2b//YLrJ7E3tsavYCec PQldagXYqIB058fk+AKYdVpOA4tSoVzXeLTUyIv6w3mpujrD812A0eSv1EaAn+iQ KiCJ9+1o1Jy+5fQLXguSAiO8qpZKgfN8 -----END PUBLIC KEY-----
- avaliku võtme omaduste küsimine
$ cat voti.pem -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxSrHPphy8fR9ryqnJqXvk8clh TMcUM1ce03mec/8l8VW6Z8I0n5dcytAfJogJ03aaNcgxIkft8S1z8cYTDhkMGKKT GpeMntYTQ9eVW1yjWWCWRM6B2U0U0ezQ44Aysl393t4BCofmSzOUJZQduinojkiI PgqwokpuOfi61E+qjwIDAQAB -----END PUBLIC KEY-----
$ openssl rsa -pubin -in voti.pem -noout -text Modulus (1024 bit): 00:b1:4a:b1:cf:a6:1c:bc:7d:1f:6b:ca:a9:c9:a9: 7b:e4:f1:c9:61:4c:c7:14:33:57:1e:d3:79:9e:73: ff:25:f1:55:ba:67:c2:34:9f:97:5c:ca:d0:1f:26: 88:09:d3:76:9a:35:c8:31:22:47:ed:f1:2d:73:f1: c6:13:0e:19:0c:18:a2:93:1a:97:8c:9e:d6:13:43: d7:95:5b:5c:a3:59:60:96:44:ce:81:d9:4d:14:d1: ec:d0:e3:80:32:b2:5d:fd:de:de:01:0a:87:e6:4b: 33:94:25:94:1d:ba:29:e8:8e:48:88:3e:0a:b0:a2: 4a:6e:39:f8:ba:d4:4f:aa:8f Exponent: 65537 (0x10001)
- ldap ja x500 order
If checked (default) the DN order of certificates issued by this CA will have the LDAP ordering: CN=Tomas Gustavsson,O=PrimeKey,C=SE
If unchecked, the DN order of certificates issued by this CA will have the X500 ordering: C=SE,O=PrimeKey,CN=Tomas Gustavsson
- Sertifikaadi kontrollimine ahela vastu
$ cat ESTEID-SK-2007.pem JUUR-SK.pem > ahel.pem $ openssl verify -CAfile ahel.pem -verbose imre.pub imre.pub: OK
- PKI sertifikaatide hierarhia tundmaõppimiseks on mõnus laadida juur ja vaheastme sertifikaadid XCA sisse, tulemus paistab nt selline (kui laaditud failis on mitu sertifikaati, kasutatakse ainult esimest)
- cert ahela küsimine
$ gnutls-cli --print-cert www.loomaaed.tartu.ee
- cert ahela faili tegemine nö sertifikaatideks
$ awk 'BEGIN {c=0;} /BEGIN CERT/{c++} { print > "cert." c ".pem"}' < id-bundle.crt
ja tulemuse nt issuerite nimekirja esitamiseks
$ for i in cert.*; do echo -n "$i: "; openssl x509 -in $i -noout -subject; done cert.1.pem: subject= /C=EE/O=AS Sertifitseerimiskeskus/OU=ESTEID/CN=ESTEID-SK 2007 cert.2.pem: subject= /emailAddress=pki@sk.ee/C=EE/O=AS Sertifitseerimiskeskus/OU=ESTEID/SN=1/CN=ESTEID-SK cert.3.pem: subject= /emailAddress=pki@sk.ee/C=EE/O=AS Sertifitseerimiskeskus/CN=Juur-SK cert.4.pem: subject= /C=EE/O=AS Sertifitseerimiskeskus/CN=EID-SK 2011/emailAddress=pki@sk.ee cert.5.pem: subject= /C=EE/O=AS Sertifitseerimiskeskus/OU=Sertifitseerimisteenused/CN=KLASS3-SK 2010 cert.6.pem: subject= /C=EE/O=AS Sertifitseerimiskeskus/CN=ESTEID-SK 2011/emailAddress=pki@sk.ee cert.7.pem: subject= /C=EE/O=AS Sertifitseerimiskeskus/CN=EE Certification Centre Root CA/emailAddress=pki@sk.ee
- bundles sisalduvate sertide nimekirja saab esitada
$ certtool -i --infile ID-2015-jrks.crt | grep Subject: Subject: EMAIL=pki@sk.ee,C=EE,O=AS Sertifitseerimiskeskus,CN=Juur-SK Subject: C=EE,O=AS Sertifitseerimiskeskus,CN=EE Certification Centre Root CA,EMAIL=pki@sk.ee Subject: C=EE,O=AS Sertifitseerimiskeskus,OU=ESTEID,CN=ESTEID-SK 2007 Subject: C=EE,O=AS Sertifitseerimiskeskus,CN=ESTEID-SK 2011,EMAIL=pki@sk.ee Subject: C=EE,O=AS Sertifitseerimiskeskus,2.5.4.97=#0c0e4e545245452d3130373437303133,CN=ESTEID-SK 2015 Subject: C=EE,O=AS Sertifitseerimiskeskus,OU=Sertifitseerimisteenused,CN=KLASS3-SK 2010 Subject: C=EE,O=AS Sertifitseerimiskeskus,OU=Sertifitseerimisteenused,CN=KLASS3-SK 2010 Subject: C=EE,O=AS Sertifitseerimiskeskus,OU=Sertifitseerimisteenused,CN=KLASS3-SK 2010 Subject: C=EE,O=AS Sertifitseerimiskeskus,CN=EID-SK 2011,EMAIL=pki@sk.ee
- SKID ja AKID
Reeglina on sertifikaatides x509v3 sektsioonis kirjas muu hulgas
- Subject Key Identifier (SKID) - tavaliselt arvutatud sertifikaadi võtmele vastavana (siis algab ta ainult 'keyid:' sõnega), st samast krüptomaterjalist moodustatud teisel sertifikaadil on sama SKID väärtus (Subject nagu sertifikaat ise)
- Authority Key Identifier (AKID) - sertifikaadi välja andnud sertifikaadi SKID väärtus (Authority nagu Certificate Authority)
- On segane lugu, mõnel juhul openssl ei kasutaja ja mõnel juhul kasutab vaikimisi /etc/ssl/certs kataloogist CA sertifikaate. Kui ta kasutab, siis saab selle praktiliselt välja lülitada keskkonnamuutujatega
$ export SSL_CERT_FILE=/tmp/seda-faili-pole.crt $ export SSL_CERT_DIR=/tmp/seda-kataloogi-pole
- Selgub, et CA'le serdi saamiseks esitatavas sertifikaadiallkirjastamistaotluses oleva signature saab CA asendada (ja küllap loogiline ka, sest req puhul allkirjastab see taotlust ja crt puhul sertifikaati), nt sha1 -> sha256.
ASN1 struktuuri esitamine
$ openssl asn1parse -in /etc/iked/certs/obsd-49-1.auul.crt
# apt-get install dumpasn1
$ openssl x509 -inform pem -outform der -in /var/tmp/MoraalO.pem | dumpasn1 -l -
Kasulikud lisamaterjalid
S/MIME
- man smime
Signatuuri moodustamine
Signatuuri moodustamiseks on vajalik privaatne võti ja sertifikaat
$ openssl smime -sign -in sisend-tekst -text -signer cert.pem \ -inkey key.pem -from "mart@looomaaed.tartu.ee" -to "priit@loomaaed.tartu.ee" -subject "no tere" To: mart@looomaaed.tartu.ee From: priit@loomaaed.tartu.ee Subject: no tere MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg="sha1"; boundary="----8C358F4E50FCDF0D949731A0D7CD13E1" This is an S/MIME signed message ------8C358F4E50FCDF0D949731A0D7CD13E1 Content-Type: text/plain see on sisend ------8C358F4E50FCDF0D949731A0D7CD13E1 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" MIIEUgYJKoZIhvcNAQcCoIIEQzCCBD8CAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3 DQEHAaCCAkswggJHMIIBsAIJAIRhO4Brjw6cMA0GCSqGSIb3DQEBBQUAMGgxCzAJ BgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMQ4wDAYDVQQHEwVUYXJ0dTEh MB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMREwDwYDVQQDEwh3d3cu .... QBOjZfyLSqm+kmYM6QeNgN/cN2qID7QEL5oR2QyUMEM/W1H6XgnNp4KqiyCezbSt hmgsFANwRid8+TKMwdBNq67nmwecG69pHNIVdGJPDYvEokj3C72M7YmIEWT78IxM kWl/UnZc ------8C358F4E50FCDF0D949731A0D7CD13E1--
Signatuuri kontrollimine
Signatuuri moodustamiseks on vajalik kasutaja sertifikaat või kasutaja sertifikaadist üles poole jääv ahel
$ openssl smime -verify -in signed.msg -CAfile cert.pem Content-Type: text/plain see on sisend Verification successful
Tühistusnimekirjade kasutamine
Tühistusnimekirju (ingl. k. CRL - Certificate Revocation Lists) kasutatakse veebiserveri juures selleks, et tühistatud sertifikaadiga kasutajad ei saaks süsteemi siseneda. Tühistusnimekirju jagab tavaliselt sama asutus, mis jagab sertifikaate. Nt Eestis tegeleb sellega Sertifitseerimiskeskus ja nimekirjad on aadressilt https://sk.ee/repositoorium/CRL/ vabalt kättesaadavad. Viisakas on mitte kopeerida neid tihedasti, vaid niipalju kui vajalik.
Tundub, et nimekirju jagatakse DER formaadis, aga kasutamine toimub Linux keskkonnas PEM formaadis andmetega, teisendamiseks sobib öelda nt
# openssl crl -inform DER -outform PEM -in esteid2011.crl -out esteid2011.crl.pem
Tühistusnimekirja sisu on nt selline
$ openssl crl -in esteid2007.pem -noout -text Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: /C=EE/O=AS Sertifitseerimiskeskus/OU=ESTEID/CN=ESTEID-SK 2007 Last Update: Jan 8 06:20:16 2010 GMT Next Update: Jan 8 19:20:16 2010 GMT CRL extensions: X509v3 CRL Number: 6612 X509v3 Authority Key Identifier: keyid:48:06:DE:BE:8C:87:57:95:80:78:63:FA:9C:23:2B:2B:A0:3A:18:75 X509v3 Issuing Distrubution Point: critical 01./.-.+http://www.sk.ee/crls/esteid/esteid2007.crl Revoked Certificates: Serial Number: 45A2A260 Revocation Date: Jan 22 08:58:45 2007 GMT CRL entry extensions: X509v3 CRL Reason Code: Unspecified Serial Number: 45A2A262 Revocation Date: Jan 22 08:58:46 2007 GMT CRL entry extensions: X509v3 CRL Reason Code: Unspecified ...
kus
- tühistusnimekirjal on kehtivuse alguse ja lõpu aeg
- tühistusnimekirja Issuer on sama, mis vastavatel sertifikaatidel
Nimekirja kehtivuse algust ja lõppu saab küsida
# openssl crl -in /etc/apache2/serdid/crl/esteid2011.crl -noout -nextupdate lastUpdate=Mar 25 12:31:04 2015 GMT nextUpdate=Mar 26 00:31:04 2015 GMT
Sertifikaati saab nimekirja vastu kontrollida selliselt
# openssl verify -CAfile ESTEID-SK_2011.pem.crt -crl_check -CRLfile esteid2011crl.pem -verbose meeri-cert.pem meeri-cert.pem: OK
Sertifikaadi subjekti kodeering
Sertifikaadi kodeeringu küsimiseks sobib öelda nt
$ openssl x509 -in /tmp/installer.id.ee.crt -noout -subject -nameopt show_type,sep_multiline,utf8 subject= C=PRINTABLESTRING:EE ST=PRINTABLESTRING:Harju L=T61STRING:Tallinn O=T61STRING:AS Sertifitseerimiskeskus CN=T61STRING:installer.id.ee
kus
- show_type - esitab kodeeringu tüübi
- sep_multiline - väljastab tulemuse erinevatel ridadel
- utf8 - estitab väärtuse ehedal UTF-8 kujul (sobib kasutada utf8 võimelises terminalis)
UTF-8 kodeeringus sertifikaat paistab selline
$ openssl x509 -in /tmp/sisene.www.moraal.ee.crt -noout -subject -nameopt show_type,sep_multiline subject= C=PRINTABLESTRING:EE ST=UTF8STRING:Harjumaa L=UTF8STRING:Tallinn O=UTF8STRING:Moraal OÜ CN=UTF8STRING:sisene.www.moraal.ee
Sertifikaadi tekitamisel saab kodeeringut mõjutada seadisusfaili /etc/ssl/openssl.cnf parameetriga string_mask
# This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString. # utf8only: only UTF8Strings. # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings # so use this option with caution! string_mask = nombstr
Teenuse kasutatavate šiffrite nimekirja küsimine
sslscan
Tarvkara sslscan http://sourceforge.net/projects/sslscan/ on olemas Debiani paketihalduses, paigaldamiseks tuleb öelda
# apt-get install sslscan
kasutamine paistab nt selline
# sslscan 10.0.6.202:443 | grep Accept Accepted SSLv3 256 bits AES256-SHA Accepted SSLv3 168 bits DES-CBC3-SHA Accepted SSLv3 128 bits AES128-SHA Accepted SSLv3 128 bits RC4-SHA Accepted TLSv1 256 bits AES256-SHA Accepted TLSv1 168 bits DES-CBC3-SHA Accepted TLSv1 128 bits AES128-SHA Accepted TLSv1 128 bits RC4-SHA
Tundub, et sslscan teeb päris agressiivset liiklust, mõnel juhul võidakse selle kasutaja teenuse tulemüüri poolt ära blokeerida.
cnark.pl
Tarvara CryptoNark http://blog.techstacks.com/cryptonark.html pole 2013 aastal Debiani paketihalduses, kasutamiseks tuleb süsteemi lisada vajalikud Perl teegid, nt
# cpan cpan > install Tie::Hash::Indexed cpan > install Mozilla::CA
Kasutamiseks öelda
# ./cnark.pl -h 10.0.6.202 -p 443 -i Testing SSLv2 Ciphers... Testing SSLv3 Ciphers... AES256-SHA -- 256 bits, High Encryption DES-CBC3-SHA -- 168 bits, High Encryption AES128-SHA -- 128 bits, High Encryption RC4-SHA -- 128 bits, Medium Encryption Testing TLSv1 Ciphers... AES256-SHA -- 256 bits, High Encryption DES-CBC3-SHA -- 168 bits, High Encryption AES128-SHA -- 128 bits, High Encryption RC4-SHA -- 128 bits, Medium Encryption
sslthing
TODO, vt sslscan
Online teenused
SSL teenuse omaduste kindlakstegemiseks on olemas mitmeid online kohti, nt
- veebikohad https://www.ssllabs.com/ssltest/
- smtp serverid http://checktls.com/
Certificate validation
- Domain Validation
- Organization Validation
- Extended Validation
Kasulikud lisamaterjalid
Kliendi sertifikaadi moodustamine
ESTEID sarnase sertifikaadi tegemiseks peaaegu sobib muu hulgas öelda midagi sellist, vist
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=EE/O=AS Sertifitseerimiskeskus/OU=ESTEID/CN=ESTEID-SK 2007" .. $ openssl req -new -key client.key -out client.csr -subj "/C=EE/O=ESTEID/OU=authentication/CN=KASK, PRIIT, 36003212713/SN=KASK/GN=PRIIT\/serialNumber=36003212713"
Kasulikud lisamaterjalid
Ajatembeldus
Ajatembeldus (ingl. k. Time Stampling) võimaldab tõendada, et mingi faili sisu eksisteeris mingil ajal.
Teenuse kasutamine
Üle võrgu ajatembelduse teenuse kasutamiseks sobib lihtsal juhul kasutada openssl paketi kooseisus olevat skripti
/usr/lib/ssl/misc/tsget
Kui puudub, siis on vajalik paigaldada pakett
# apt-get install libwww-curl-perl
Olgu olemas tembeldatav fail tekst.txt, templi saamiseks tuleb esmalt tekitada request
$ openssl ts -query -data tekst.txt -cert -sha256 > tekst.req
ning seejärel võtta requestile tempel, tundub, et veateadet võib ignoreerida (NB! SignServer URI on vaikimisi /signserver/tsa?workerId=1)
$ /usr/lib/ssl/misc/tsget -h http://tsa.sk.ee/ tekst.req Undefined subroutine &WWW::Curl::Easy::global_cleanup called at /usr/lib/ssl/misc/tsget line 196
Tulemusena on olemas sellised failid
$ ls -ld * -rw-r--r-- 1 imre imre 70 Jun 29 00:18 tekst.req -rw-r--r-- 1 imre imre 2039 Jun 29 00:19 tekst.tsr -rw-r--r-- 1 imre imre 30 Jun 29 00:18 tekst.txt
Tulemuse kontrollimiseks sobib öelda
$ openssl ts -verify -queryfile tekst.req -in tekst.tsr -CAfile EE_Certification_Centre_Root_CA.pem.crt Verification: OK
või
$ openssl ts -verify -data tekst.txt -in tekst.tsr -CAfile EE_Certification_Centre_Root_CA.pem.crt Verification: OK
Märkused
- saab võtta ajatempli ka curl abil
$ cat tekst.request | curl -s -S -H 'Content-Type: application/timestamp-query' --data-binary @- \ http://tsa.sk.ee/ -o tekst.tsr
- info
$ openssl ts -reply -in fail.tsr -text Status info: Status: Granted. Status description: Operation Okay Failure info: unspecified TST info: Version: 1 Policy OID: 0.4.0.2023.1.1 Hash Algorithm: sha256 Message data: 0000 - 87 fa e0 56 df 47 e6 ac-67 17 b6 04 15 bb 49 ae ...V.G..g.....I. 0010 - d1 d7 03 dd 3d 44 36 1e-cb 30 4b 6b d9 e3 83 0b ....=D6..0Kk.... Serial number: 0x652FBBCE8E08BF31 Time stamp: Jun 28 10:16:26 2016 GMT Accuracy: 0x01 seconds, unspecified millis, unspecified micros Ordering: no Nonce: 0xEAB31CC80111776A TSA: DirName:/C=EE/O=AS Sertifitseerimiskeskus/OU=TSA/CN=SK TIMESTAMPING AUTHORITY
kus
- TSA - ajatembeldaja sertifikaadilt andmed
Teenuse pakkumine
SignServer kasutamine WildFly v. 10 rakendusserveriga
GnuTLS
- sertifikaadi sisu esitamine
$ certtool -i --infile cert.pem
- TOFU (trust on first use) abil küsitakse nõusolek ja salvestatakse teenuse sertifikaat .gnutls/known_hosts faili (sarnaselt ssh kliendi käitumisele), kasutades lisaks --no-ca-verification saab korraldada ainult teenuse sertifikaadi kontrolli (st ei pöörata tähelepanu ahelale)
$ gnutls-cli --no-ca-verification --tofu --print-cert sr.moraal.ee .. Host sr.moraal.ee (https) has never been contacted before. Its certificate is valid for sr.moraal.ee. Are you sure you want to trust it? (y/N):
edaspidi kui teenuse sertifikaat klapib, usaldatakse
$ gnutls-cli --no-ca-verification --tofu --print-cert sr.moraal.ee .. - Description: (TLS1.2)-(DHE-RSA-1024)-(AES-128-CBC)-(SHA1) - Session ID: 55:E7:B5:AF:2A:8A:C5:C5:77:E9:49:53:53:3F:46:5C:9F:C7:D9:C6:57:50:5B:31:27:B1:51:F8:85:A8:83:07 - Ephemeral Diffie-Hellman parameters - Using prime: 1024 bits - Secret key: 320 bits - Peer's public key: 1017 bits - Version: TLS1.2 - Key Exchange: DHE-RSA - Server Signature: RSA-SHA1 - Cipher: AES-128-CBC - MAC: SHA1 - Compression: NULL - Handshake was completed - Simple Client Mode:
- OCSP kontroll
$ gnutls-cli --ocsp --x509cafile=/tmp/EE_Certification_Centre_Root_CA.pem.crt --print-cert sr.riik.ee .. - Status: The certificate is trusted. Connecting to OCSP server: ocsp.sk.ee... Resolving 'ocsp.sk.ee'... Connecting to '62.65.42.42:80'... - OCSP server flags certificate not revoked as of Sun Jul 24 11:51:47 2016 ...
- komplekti kuulub p11tool tööriist, nt
# p11tool --list-tokens Token 0: URL: pkcs11:model=p11-kit-trust;manufacturer=PKCS%2311%20Kit;serial=1;token=System%20Trust Label: System Trust Type: Trust module Manufacturer: PKCS#11 Kit Model: p11-kit-trust Serial: 1 Module: p11-kit-trust.so Token 1: URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA0909781;token=PIN1%20%28OOLBERG%2cIMRE%2c37003212713%29 Label: PIN1 (OOLBERG,IMRE,37003212713) Type: Hardware token Manufacturer: AS Sertifitseerimiskeskus Model: PKCS#15 emulated Serial: AA0909781 Module: opensc-pkcs11.so Token 2: URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA0909781;token=PIN2%20%28OOLBERG%2cIMRE%2c37003212713%29 Label: PIN2 (OOLBERG,IMRE,37003212713) Type: Hardware token Manufacturer: AS Sertifitseerimiskeskus Model: PKCS#15 emulated Serial: AA0909781 Module: opensc-pkcs11.so
TLS krüpto
Mõisted
- TLS - transport layer security
- MAC - message authentication code
- key exchange - TODO
Tööpõhimõte
TLS krüpto võimaldab kahel osapoolel suhelda turvaliselt üle ebaturvalise andmeside ühenduse, nt interneti. TLS kanali toimimine koosneb kahest osast
- turvalise kanali kokkuleppimine - kasutatakse key exchange ja authentication algoritme
- andmevahetuse sümmeetriline krüptimine kokkulepitud kanali sees - kasutatakse encryption ja mac algoritme
Turvalist kanalit määratleb kasutatav 'cipher suite', mis sisaldab endas mitmeid kompoente, muuhulgas mainitud 'key exchange algorithm', authentication algorithm', 'encryption algorithm' ja 'hashing algorithm (mac)', lisaks nt tls protokolli number, public key sertifikaadid oma võtme pikkustega, sümmeetrilise krüpto võtme pikkus. Ühele ja samale cipher suite'ile viidatakse erinevate nime kujudega, kusjuures 'cipher id' väärtus paistab olevat universaalne.
TLS ühenduse moodustamiseks läbitakse sellised sammud
- lepitakse kokku protokoll, TLS v. 1.0, 1.1 jne
- lepitakse diffie-hellman abil kokku kasutatavad avalikud võtmed; seejuures serveri avaliku võtme abil saab klient kontrollida serveri autentsust
- lisaks võib server kontrollida kliendi autentsust küsides kliendilt sertifikaati
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 cipher suite kasutamine
Nt on 2017 aastal populaarne selline cipher id väärtusega 0x00C030. https://www.thesprawl.org/research/tls-and-ssl-cipher-suites/ tabelis on 0x00C030 nimi kirjas selliselt
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Nime tuleks üldiselt lugeda selliste elementidega
- protokoll - TLS
- Key exhange - ECDHE
- Authentication - RSA
- Symmetric encryption - AES_256_GCM
- Symmetric encryption bits - 256
- MAC - SHA384
Seejuures, esimesed kaks tegelevad turvalise kanali kokkuleppimisega (ECDHE_RSA); teised kaks kanali sees andmete sümmeetriliselt krüptimisega (AES_256_GCM_SHA384).
Sellele cihper suite'ile viidatakse erinevates programmides sarnaselt
- sslscan väljundis
# sslscan www.eesti.ee:443 | grep Accep Accepted TLSv1 256 bits ECDHE-RSA-AES256-SHA <------- Accepted TLSv1 256 bits AES256-SHA Accepted TLSv1 256 bits CAMELLIA256-SHA Accepted TLSv1 128 bits ECDHE-RSA-AES128-SHA Accepted TLSv1 128 bits AES128-SHA
- Chrome brauseris
kus on kirjas Protocol TLS 1.2, kanali moodustamine ECDHE_RSA ja sümmeetriline krüptimine kanali sees AES_256_GCM
- Firefox brauseris
kus on kirjas TLS_...
- f5 tmm utiliidi väljundis
# tmm --clientciphers 'ECDHE:DEFAULT:!SSLv3:!DHE:RSA+HIGH:!3DES' ID SUITE BITS PROT METHOD CIPHER MAC KEYX 0: 49200 ECDHE-RSA-AES256-GCM-SHA384 256 TLS1.2 Native AES-GCM SHA384 ECDHE_RSA <------- 1: 49192 ECDHE-RSA-AES256-SHA384 256 TLS1.2 Native AES SHA384 ECDHE_RSA 2: 49172 ECDHE-RSA-AES256-CBC-SHA 256 TLS1 Native AES SHA ECDHE_RSA 3: 49172 ECDHE-RSA-AES256-CBC-SHA 256 TLS1.1 Native AES SHA ECDHE_RSA 4: 49172 ECDHE-RSA-AES256-CBC-SHA 256 TLS1.2 Native AES SHA ECDHE_RSA ...
Märkused
- kui kanali moodustamise key exchange ja auth on mõlemad RSA, siis mingitel juhtudel jäetakse need nimes esitamata, nt sslscan väljundis AES128-SHA vastab tabeli väärtus TLS_RSA_TODO.
- TLS'iga sarnasel põhimõttel töötab ka OpenSSH (võrreldes TLS'iga tegeleb OpenSSH kaugligipääsule spetsiifiliste küsimustega, terminali haldus, mitu paralleelset ühendus ühe turvalise kanali sees jms)
TLS sertifikaadi moodustamine
EC võtme tekitamine
$ openssl ecparam -out server.key -name secp384r1 -genkey
req tekitamine
$ openssl req -nodes -new -key server.key -out req.pem
sertifikaadi tekitamine
$ openssl x509 -req -days 3650 -in req.pem -signkey server.key -out server.crt
Tulemusena tekitati selline sertifikaat
# openssl x509 -in www.loomaaed.tartu.ee.crt -noout -text Certificate: Data: Version: 1 (0x0) Serial Number: 18220413898818738701 (0xfcdbe9e7b3ae5a0d) Signature Algorithm: ecdsa-with-SHA256 Issuer: C=EE, ST=Tartumaa, L=Tartu, O=MORAAL, CN=www.moraal.ee Validity Not Before: Sep 24 20:08:41 2017 GMT Not After : Sep 22 20:08:41 2027 GMT Subject: C=EE, ST=Tartumaa, L=Tartu, O=MORAAL, CN=www.moraal.ee Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (384 bit) pub: 04:c0:fe:79:a6:34:3d:19:a5:92:4a:2f:de:19:c1: 47:ae:32:12:48:9c:65:9f:d0:9c:c3:83:68:e0:67: 2f:e9:7d:d2:a0:82:7b:c3:78:2c:9b:21:b1:8a:3d: b6:17:63:f5:59:8d:71:7c:b0:af:a8:fe:93:a9:0b: 41:23:68:1b:b8:a6:36:77:47:33:27:95:d0:66:72: 3f:5c:19:9f:27:e5:3a:a4:0c:b7:57:6f:fb:9c:b1: 78:75:8a:5d:d3:9b:51 ASN1 OID: secp384r1 NIST CURVE: P-384 Signature Algorithm: ecdsa-with-SHA256 30:66:02:31:00:fd:ce:1b:f0:9b:8e:9f:c8:d4:b3:3c:a1:ad: 70:6d:a8:e5:28:57:6d:a1:ac:dc:fa:bd:1b:45:ce:e9:10:8a: f5:d2:cd:25:86:dc:bd:e1:68:88:43:85:72:da:89:ab:99:02: 31:00:9d:ec:7b:c0:db:14:19:42:5a:d8:41:cc:bd:8a:12:b8: e5:9f:11:37:1d:7f:fb:96:81:f8:d4:93:df:2b:c7:52:94:32: 0e:98:93:fc:80:85:db:50:b0:f4:ec:04:f9:90
block ja stream sümmeetrilise cipher kasutamine
TODO
- Salsa20
- ChaCha20
RSA
TODO
ECC
TODO
Kasulikud lisamaterjalid
- https://www.thesprawl.org/research/tls-and-ssl-cipher-suites/
- https://en.wikipedia.org/wiki/Cipher_suite
- https://www.digicert.com/ssl-cryptography.htm
- https://www.digicert.com/ecc-csr-creation-ssl-installation-apache.htm
- https://www.zeitgeist.se/2014/08/23/optimize-aes-and-chacha20-usage-with-boringssl/
SNI
SNI kasutamiseks sobib öelda nt
$ openssl s_client -servername www.moraal.ee -connect www.moraal.ee:443
ocsptool
gnutls-bin tarkvara komplekti kuulub programm ocsptool. Tundub, et ta on 'openssl ocsp' programmist kaasaegsem, nt toetab http/1.1 protokolli, aga samas pole nii paindlik. Nt sellise sertifikaadi puhul
$ openssl x509 -in imre.pub -noout -text | grep OCSP OCSP - URI:http://aia.sk.ee/esteid2015
ning
$ openssl x509 -in imre.pub -noout -issuer issuer= /C=EE/O=AS Sertifitseerimiskeskus/2.5.4.97=NTREE-10747013/CN=ESTEID-SK 2015
sobib ocsp päringu esitamiseks sobib öelda
$ ocsptool -V --ask http://aia.sk.ee/esteid2015 --load-signer ESTEID-SK_2015.pem.crt --load-issuer ESTEID-SK_2015.pem.crt --load-cert imre.pub Connecting to OCSP server: aia.sk.ee... Resolving 'aia.sk.ee'... Connecting to '62.65.42.42:80'... OCSP Response Information: Response Status: Successful Response Type: Basic OCSP Response Version: 1 Responder ID: C=EE,O=SK ID Solutions AS,2.5.4.97=#0c0e4e545245452d3130373437303133,OU=OCSP,CN=ESTEID-SK 2015 AIA OCSP RESPONDER 201804 Produced At: Thu Apr 26 05:28:50 UTC 2018 Responses: Certificate ID: Hash Algorithm: SHA1 Issuer Name Hash: ff270fa54b3dda50fbfe22dbda8842410ef313ee Issuer Key Hash: b3ab88bc99d562a4852a08cdb41d723b83724751 Serial Number: 119134a3990b14275a1ded6d2be71ac6 Certificate Status: good This Update: Thu Apr 26 05:28:50 UTC 2018 Extensions: Verifying OCSP Response: Success.
kus
- TODO
pkcs11 kasutamine softhsm2 seadmega
pkcs11 kasutamise kaudu saab openssl suhelda erinevate HSM seadmetega, nt tarkvaralise SoftHSM2 seadmega. Lisaks on vajalik paigaldada tarkvara
# apt-get install opensc libengine-pkcs11-openssl
Järgnev põhineb SoftHSM2 kasutamise näitel, seega peab olema süsteemi paigaldatud SoftHSM2 tarkvara
# apt-get install softhsm2
ning see kasutamiseks initsialiseeritud
# softhsm2-util --init-token --slot 0 --label tok
Seejärel tuleb OpenSSL seadistusfailis kirjeldada krüpto mootor (ingl. k. engine) nt lisades rea 'oid_section = new_oids' järele sektsiooni
# Extra OBJECT IDENTIFIER info: #oid_file = $ENV::HOME/.oid oid_section = new_oids openssl_conf = openssl_def [openssl_def] engines = engine_section [engine_section] pkcs11 = pkcs11_section [pkcs11_section] engine_id = pkcs11 dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/libpkcs11.so MODULE_PATH = /usr/lib/softhsm/libsofthsm2.so init = 0
kus
- engine_id - engine nimi mida seejärel openssl käskude suvandites kasutatakse
- dynamic_path on üldotstarbelise pkcs11 teegi path
- MODULE_PATH on konkreetne krüptomooduli teegi path, antud juhul SoftHSM2
Konfi üldiseks kontrollimiseks sobib öelda
# openssl engine -t -c pkcs11 (pkcs11) pkcs11 engine [RSA] [ available ]
ja nt juhusliku arvu genereerimiseks
# openssl rand -engine pkcs11 -hex 64 engine "pkcs11" set. 495a8f3d3723005245677744e2b90b972b3ecced0737eac71500be7224908837ecea6ad0119ae0065a5a561962f0e51ff2385cca52a9dd651c73b4feb69b146d
Krüptomaterjali (võtmepaari) tekitamiseks sobib öelda
# pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --login --pin 1234 --keypairgen --key-type rsa:2048 --label "voti_sign" --usage-sign Using slot 0 with a present token (0x533a81ba) Key pair generated: Private Key Object; RSA label: voti_sign Usage: decrypt, sign, unwrap Public Key Object; RSA 2048 bits label: voti_sign Usage: encrypt, verify, wrap
võtmete nimekirja küsimiseks
# pkcs11-tool --module /usr/lib/softhsm/libsofthsm2.so --login --pin 1234 -O Using slot 0 with a present token (0x533a81ba) Private Key Object; RSA label: my_key3 Usage: decrypt, sign, unwrap Public Key Object; RSA 2048 bits label: my_key2 Usage: encrypt, verify, wrap
CSR tekitamiseks
# openssl req -new -subj '/CN=test/' -sha256 -engine pkcs11 -keyform engine -key slot_1396343226-label_voti_sign engine "pkcs11" set. Enter PKCS#11 token PIN for tok: -----BEGIN CERTIFICATE REQUEST----- MIICcjCCAVoCAQAwDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBALQ4LI9Bj7YkfIFrEB2DYxi2GTdFhjx8FaJEEQpS/L6eYRvK IUIuL0JII9xr87bsVZjNXJo7gwQc/YvIkDjKt7JvDfbyK+4OQ9bx5pmhkce61/Hd JPizA4Qiji51FTd6BQboY+IoCHsyUrm3j4sPe4FxW3nqxEjOcwy3W3GfB1vki/Ub nCSk1BAjSntoVEVgdtBFyM6I/NvcE3K7YLIhM5tFI8pmjM9RVfnR2wDoClxCQJdk KqAKEArEFivhdzW9VfLgyVDBX54DDWXa+MlvQzWe0UdGY4GfR4g53sKbmw9/hEPG pxjNs1NDqkz6IiAn6YKKhKoizZ1VYtoZ/hHfEFsCAwEAAaAeMBwGCSqGSIb3DQEJ DjEPMA0wCwYDVR0PBAQDAgZAMA0GCSqGSIb3DQEBCwUAA4IBAQAwSZltguU6he1T 8JpeVccRqnj7fDruFJaJBjH9mkWis9Szle0NVVtesSXYGPO5PJoXgkJEULqM7cqC jkRBgiyqjPmlB8+R+sf9skTJuhxpxdP2tGbFHaZyc0JBMzgT8k7CVEsg5QGynAko Y52OS+1tZyGTDGMxq//XobC99cYtsGenbPANjjAPAGwHbkIMp0Y/Kx0u+3rF4a8c plZpUKDS1y5QXo7BeWvRotqXdZ48sfFdwCR9ZBOFdLl/HnTM5V3mTU6XUObIr/Nc ePmMd1zmDN8uBH5RIXAgMY3fdkK4DEZWS6d6jMIDqX1VH2wyJ8iTe4Q0Ho2bMSXW BAE0jWhd -----END CERTIFICATE REQUEST-----
kus
- slot_1396343226-label_voti_sign koosneb slot numberist (kujul slot_#) ja võtme labelist (kujul label_XXX) ning need kaks komponenti on eraldatud _ märgiga
- küsitakse tokeni pin
Kasulikud lisamaterjalid
- https://forum.nginx.org/read.php?29,251983,254409
- https://github.com/carblue/acos5_64/blob/master/howto/HOWTO_Create_Your_own_CA_root_hierarchy_on_Linux
pkcs11 kasutamine Luna NetHSM seadmega
Eeldusel, et krüptomaterjal on HSM peal olemas
# pkcs11-tool --module /usr/safenet/lunaclient/lib/libCryptoki2_64.so --slot 5 -O -l Logging in to "HAPART". Please enter User PIN: Public Key Object; RSA 1024 bits label: votmenimi ID: 20250202fc1e0f93c1c29d1008c7cabc Usage: encrypt, verify Private Key Object; RSA label: votmenimi ID: 20250202fc1e0f93c1c29d1008c7cabc Usage: decrypt, sign
ning openssl seadisufailis kasutatakse sektsiooni
openssl_conf = openssl_def [openssl_def] engines = engine_section [engine_section] pkcs11 = pkcs11_section [pkcs11_section] engine_id = pkcs11 dynamic_path = /usr/lib/engines/engine_pkcs11.so MODULE_PATH = /usr/lib/libCryptoki2_64.so init = 0
saab openssl utiliidi abil genereerida csr'i
# openssl req -new -subj '/CN=testiks tehtud subjekt/' -sha256 -engine pkcs11 -keyform engine -key slot_5-label_votmenimi engine "pkcs11" set. PKCS#11 token PIN: -----BEGIN CERTIFICATE REQUEST----- MIIBYDCBygIBADAhMR8wHQYDVQQDDBZ0ZXN0aWtzIHRlaHR1ZCBzdWJqZWt0MIGf MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDGwQ0M6QZM2FlNeSxUOV7tY+FL+4tM Q1SD7yoFVKVGi68ustupDaj0e0C+bN3TvrS9BqIjfYX0+ST3ZYvxKgpCT0UbE0nj 1TcshvlJwdf7s/rZ3NKKCC5aV8k0r/ys2IDFVwghQNLx9MyEYHs7X16o3S2QB0/4 zUo/NI01Ul1NkwIDAQABoAAwDQYJKoZIhvcNAQELBQADgYEAqQufdYXXyILQheQw gBt//OQIT/pCKjB74YgoZhoYO2xAs/pQGb9U1SMjFWyZTMguMruA8kYbtjIhdYCh f5MPQE0o0xQ0aeyNZyiP1vIsRuHccpdZpslgDkHb6mX+hYVq19Zgui8O0TXcKLyX srHaFpovFZQUuxuvax9lUSi3O2c= -----END CERTIFICATE REQUEST-----
kus
- TODO
pkcs11-proxy kasutamine
Märkus: tundub, et 2018 kevadel pkcs11-proxy https://github.com/SUNET/pkcs11-proxy tarkvara ei ole kasutatav
Tööpõhimõte
pkcs11-proxy abil edastatakse pkcs11 protokolli tegevused üle võrgu
pkcs11 klient (nt openssl) -> pkcs11-proxy teek (arvuti 1) -> pkcs11-daemon (arvuti 2) -> konkreetse hsm seadme teek (nt softhsm)
Tarkvara paigaldamine
Tarkvara on pakendatud Ubuntu v. 14.04 jaoks
arvuti-hsm-server # apt-get intsall pkcs11-daemon arvuti-hsm-klient # apt-get install pkcs11-proxy1
Kasutamine
Käivitamine hsm seadme arvutis (seadmes on softhsm iseenesest kasutamiseks ettevalmistatud, st töötab lokaalselt tavapärasel viisil)
arvuti-hsm-server # export PKCS11_DAEMON_SOCKET="tcp://192.168.78.34:2345" arvuti-hsm-server # /usr/bin/pkcs11-daemon /usr/lib/softhsm/libsofthsm.so
Käivitamine hsm klienti arvutis
arvuti-hsm-klient # export PKCS11_PROXY_SOCKET="tcp://192.168.78.34:2345" arvuti-hsm-klient # /usr/bin/pkcs11-tool --module=/usr/lib/libpkcs11-proxy.so -L Available slots: Slot 0 (0x0): SoftHSM token label : softhsm token manufacturer : SoftHSM token model : SoftHSM token flags : rng, login required, PIN initialized, token initialized, other flags=0x40 hardware version : 1.3 firmware version : 1.3 serial num : 1
Kuid millegipärast kasutamine ei õnnestu, nt krüptomaterjali nimekirja esitamine
# /usr/bin/pkcs11-tool --module=/usr/lib/libpkcs11-proxy.so --login --pin 1234 -O Using slot 0 with a present token (0x0) (hangub siis, ctrl-c lõpetab)
P11
Kompileerimine
# ./configure --prefix=/opt/p11-glue ... configure: build options: Host: x86_64-pc-linux-gnu Debug build: default (-g, debug output) Strict build: no Build documentation: no (no manual or reference) System global config: ${prefix}/etc/pkcs11/pkcs11.conf System module config directory: ${prefix}/etc/pkcs11/modules Package module config directory: ${pkgdatadir}/modules User global config: ~/.config/pkcs11/pkcs11.conf User module config directory: ~/.config/pkcs11/modules Load relative module paths from: ${exec_prefix}/lib/pkcs11 With libtasn1 dependency: yes With libffi: yes With hash implementation: internal Build trust module: yes Trust module paths: /etc/ssl/certs/ca-certificates.crt
Turvaserveri token
Token ID: 736f667468736d333062623837643265303430323465383264747333 User PIN to be changed: false Firmware Version: 2.04 Protected authentication path: false User PIN locked: false Clock on token: false User PIN initialized: true Label: ts3 User PIN count low: false Has RNG: true Serial Number: bb87d2e04024e82d Type: Hardware Max PIN length: 255 Manufacturer ID: SoftHSM project User PIN final try: false Model: SoftHSM v2 Min PIN length: 4 Token write protected: false
võtme genereerimine ei toimi ja kijrutatakse softhsm2 arvutisse
p11-kit: 'p11_buffer_ok (buffer)' not true at p11_buffer_append p11-kit: shouldn't be reached at p11_rpc_buffer_add_uint32 p11-kit: 'p11_buffer_ok (buffer)' not true at p11_buffer_append p11-kit: 'at != NULL' not true at p11_buffer_add p11-kit: 'p11_buffer_ok (buffer)' not true at p11_buffer_append p11-kit: shouldn't be reached at p11_rpc_buffer_add_uint32 p11-kit: 'p11_buffer_ok (buffer)' not true at p11_buffer_append p11-kit: shouldn't be reached at p11_rpc_buffer_add_uint32
Tundub, et katsetamiseks on vajalik p11-kit v. 0.23.9 või uuem, nt Ubuntu 18.04 ja Debian v. 10 sobivad.
Serveri poolse protsessi käivitamine
$ p11-kit server --provider /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so "pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA1253517;token=PIN1%20%28OOLBERG%2cMEERI%2c44207262721%29" P11_KIT_SERVER_ADDRESS=unix:path=/run/user/1000/p11-kit/pkcs11-28092 P11_KIT_SERVER_PID=28093 $
Tulemusena tekib protsess
imre 17859 0.0 0.0 14120 200 ? Ss 11:43 0:00 server --provider /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA1253517;token=PIN1%20%28OOLBERG%2cMEERI%2c44207262721%29
p11 soket edastamiseks sobib öelda
fuusiline$ ssh -R /run/user/1000/p11-kit/pkcs11:/run/user/1000/p11-kit/pkcs11-17859 imre@192.168.10.222
ning teises arvutis, vaikimisi kasutab p11-kit-client.so soketit /run/user/1000/p11-kit/pkcs11
virtuaalne$ p11tool --list-tokens --provider /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-client.so Token 0: URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA1253517;token=PIN1%20%28OOLBERG%2cMEERI%2c44207262721%29 Label: PIN1 (OOLBERG,MEERI,44207262721) Type: Hardware token Manufacturer: AS Sertifitseerimiskeskus Model: PKCS#15 emulated Serial: AA1253517 Module: (null) virtuaalne$ p11tool --list-all --provider /usr/lib/x86_64-linux-gnu/pkcs11/p11-kit-client.so Object 0: URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA1253517;token=PIN1%20%28OOLBERG%2cMEERI%2c44207262721%29;id=%01;object=Isikutuvastus;type=cert Type: X.509 Certificate Label: Isikutuvastus ID: 01 Object 1: URL: pkcs11:model=PKCS%2315%20emulated;manufacturer=AS%20Sertifitseerimiskeskus;serial=AA1253517;token=PIN1%20%28OOLBERG%2cMEERI%2c44207262721%29;id=%01;object=Isikutuvastus;type=public Type: Public key Label: Isikutuvastus ID: 01
Misc
- socket edastamine üle võrgu ssh abil
$ ssh -L /var/tmp/pg/.s.PGSQL.5432:/var/run/postgresql/.s.PGSQL.5432 root@192.168.10.222 $ psql -h /var/tmp/pg -p 5432 -U mw -W mw Password for user mw: psql (10.4 (Ubuntu 10.4-2.pgdg18.04+1), server 10.3 (Debian 10.3-2)) Type "help" for help. mw=>
- socket edastamine üle võrgu socat abil
# socat "UNIX-LISTEN:/run/user/0/p11-kit/pkcs11,reuseaddr,fork" EXEC:'ssh imre@192.168.10.219 socat STDIO UNIX-CONNECT\:/run/user/1000/p11-kit/pkcs11-28092'
Kasulikud lisamaterjalid
- https://archive.fosdem.org/2017/schedule/event/smartcard_forwarding/
- https://access.redhat.com/blogs/766093/posts/3248871
- https://p11-glue.github.io/p11-glue/p11-kit/manual/
Modulusest rsa pub võtme tekitamine
$ cat gen.conf # Start with a SEQUENCE asn1=SEQUENCE:pubkeyinfo # pubkeyinfo contains an algorithm identifier and the public key wrapped # in a BIT STRING [pubkeyinfo] algorithm=SEQUENCE:rsa_alg pubkey=BITWRAP,SEQUENCE:rsapubkey # algorithm ID for RSA is just an OID and a NULL [rsa_alg] algorithm=OID:rsaEncryption parameter=NULL # Actual public key: modulus and exponent [rsapubkey] n=INTEGER:0xB14AB1CFA61... e=INTEGER:0x10001
kus
- e on nagu tavaliselt kombeks 10001
- n on konkreetne Modulus (nagu väljastab nt käsk ' openssl rsa -pubin -in voti.pem -modulus -noout')
$ openssl asn1parse -genconf gen.conf -out pubkey.der -noout $ openssl rsa -in pubkey.der -inform der -pubin -out pubkey.pem $ openssl rsa -pubin -in pubkey.pem -noout -text
Kasulikud lisamaterjalid
- https://stackoverflow.com/questions/11541192/creating-a-rsa-public-key-from-its-modulus-and-exponent
- https://crypto.stackexchange.com/questions/18031/how-to-find-modulus-from-a-rsa-public-key
2018
ECC võtme genereerimine
$ openssl ecparam -out server.key -name prime256v1 -genkey
ECC csr tekitamine
$ openssl req -new -key server.key -out server.csr
Security level
TODO
Certificate Transparency
TODO
Kasulikud lisamaterjalid
- https://en.wikipedia.org/wiki/Certificate_Transparency
- https://transparencyreport.google.com/https/certificates
DTLS - Datagram Transport Layer Security
Self-signed materjali tekitamiseks
$ openssl req -nodes -sha256 -new -keyout www.loomaaed.tartu.ee.key -newkey rsa:2048 > www.loomaaed.tartu.ee.csr $ openssl x509 -req -days 3650 -in www.loomaaed.tartu.ee.csr -signkey www.loomaaed.tartu.ee.key -out www.loomaaed.tartu.ee.crt
Serveri poolel öelda
$ openssl s_server -cert www.loomaaed.tartu.ee.crt -key www.loomaaed.tartu.ee.key -dtls1 -accept 4444 Using default temp DH parameters ACCEPT
ja kliendi poolel
$ openssl s_client -dtls1 -connect 127.0.0.1:4444
Kasulikud lisamaterjalid
- http://khanna111.com/wordPressBlog/2014/10/18/dtls-and-openssl-quick-setup-for-server-and-client/
- https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security
Kasulikud lisamaterjalid
- TinyCA kasutamine
- Sertifikaadid
- http://en.wikipedia.org/wiki/OpenSSL
- http://www.madboa.com/geek/openssl/
- http://shib.kuleuven.be/docs/ssl_commands.shtml
- https://en.wikipedia.org/wiki/OCSP_stapling
- http://certificateerror.blogspot.com.ee/2011/02/how-to-validate-subject-key-identifier.html
- https://www.v13.gr/blog/?p=293
- http://www.sebdangerfield.me.uk/2011/12/setting-up-a-centralised-syslog-server-in-the-cloud/