OpenSSL

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

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
  • 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  -
  • 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)

Fail:Openssl-1.gif

  • 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

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

Fail:Openssl-2.gif

kus on kirjas Protocol TLS 1.2, kanali moodustamine ECDHE_RSA ja sümmeetriline krüptimine kanali sees AES_256_GCM

  • Firefox brauseris

Fail:Openssl-3.gif

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

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

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

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

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

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

Kasulikud lisamaterjalid