Allekirjoitus voidaan suorittaa myös toimikortilla (esim. virkakortti). Tätä varten on asennettava OpenSSL:n PKSC11-moottori.
$ sudo yum install engine_pkcs11
PKCS#11-moottorin asetukset pitää lisätä OpenSSL:n globaaliin asetustiedostoon. MODULE_PATH viittaa Fujitsu DigiSign:n PKCS#11-kirjastoon.
/etc/pki/tls/openssl.cnf:
[engine_section]
pkcs11 = pkcs11_section
[pkcs11_section]
engine_id = pkcs11
dynamic_path = libpkcs11.so
MODULE_PATH = /usr/lib64/libcryptoki.so
init = 0
Esimerkeissä käytetään pkcs11_tool-työkalua PKSC#11-laitteiden käsittelyyn. Vastaavat toiminnot ovat käytettävissä myös OpenSSL:n kautta , mutta pkcs11_tool -työkalulle on helpompi antaa tieto käytettävästä toimikortista.
Tiedoston allekirjoittaminen
Luodaan yksinkertainen tiedoston allekirjoitus ja tarkastetaan se.
Allekirjoittaminen
Luodaan tiedosto, joka allekirjoitetaan esimerkissä.
esimerkki.txt:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tempor libero nec vulputate fermentum. In hac habitasse platea dictumst. Morbi hendrerit malesuada turpis nec porttitor. Aenean posuere, sapien nec gravida convallis, massa nisi porta ligula, ac dictum ex tellus sit amet enim. Proin et justo nec ex tincidunt placerat non at enim. Integer in euismod arcu. Nullam ac rutrum dui, a fringilla orci. Maecenas condimentum turpis non augue mollis ullamcorper. Pellentesque et nisl est. Aenean tincidunt dui sit amet cursus efficitur.
Suoritetaan allekirjoitus OpenSSL:n dgst-sovelluksella, käyttäen avainta tiedostosta. Lisäksi muunnetaan allekirjoitus base64-muotoon. Tarkalleen ottaen vain ensimmäinen komento on pakollinen, mutta tiedoston muuntaminen base64-muotoon helpottaa usein sen käsittelyä.
$ openssl dgst -sha512 -sign mikko.key -out esimerkki.txt.sha512 esimerkki.txt
$ openssl base64 -in esimerkki.txt.sha512 -out esimerkki.txt.signature
$ rm esimerkki.txt.sha512
Helpoin tapa suorittaa allekirjoitus on sovelluksella pkcs11-tool. Esimerkki olettaa, että työasemassa on vain yksi kortinlukija ja käytetty kortti on VRK:n tuottama virkakortti, jonka 2. varmennetta käytetään allekirjoitukseen.
$ pkcs11-tool --module /usr/lib64/libcryptoki.so --login --sign --id 45 --input esimerkki.txt --output esimerkki.txt.sha512 --signature-format openssl --slot 2 -m SHA512-RSA-PKCS
Logging in to "Organisaatiokortti (PIN2)".
Please enter User PIN:
Using signature algorithm SHA512-RSA-PKCS
$ openssl base64 -in esimerkki.txt.sha512 -out esimerkki.txt.signature
$ rm esimerkki.txt.sha512
Allekirjoituksen tarkastaminen
Allekirjoituksen tarkastaminen turvallisesti vaatii hieman enemmän työtä. Tarkastamiseksi tiedosto muunnetaan takaisin binäärimuotoon, tarkastetaan lähettäjän varmenteen olevan varmentajan allekirjoittama ja sulkulistaamaton, jonka jälkeen puretaan varmenteesta julkinen avain ja suoritetaan allekirjoituksen tarkastaminen.
$ openssl base64 -d -in esimerkki.txt.signature -out esimerkki.txt.sha512
$ openssl verify -verbose -crl_download -crl_check -CAfile cacert.pem mikko.crt
server.crt: OK
$ openssl x509 -pubkey -noout -in mikko.crt > mikko_pubkey.pem
$ openssl dgst -sha512 -verify mikko_pubkey.pem -signature esimerkki.txt.sha512 esimerkki.txt
$ Verified OK
$ rm esimerkki.txt.sha512
$ rm mikko_pubkey.pem
Varmentajan varmenteet voi halutessaan ottaa edellistä varten toimikortilta.
$ pkcs11-tool --module /usr/lib64/libcryptoki.so -r -y cert -d 48 -o vrkroota.der
$ openssl x509 -in vrkroota.der -outform PEM -out vrkroota.pem
$ pkcs11-tool --module /usr/lib64/libcryptoki.so -r -y cert -d 47 -o vrkqc2c.der
$ openssl x509 -in vrkqc2c.der -outform PEM -out vrkqc2c.pem
Tiedoston salaaminen
Seuraavassa esimerkissä salataan tiedosto käyttäen varmenteita. Lisäksi luodaan allekirjoitus, joka lähetetään salattuna vastaanottajalle. Ilman allekirjoitusta vastaanottaja ei voi olla varma tiedoston lähettäjästä.
Periaatteessa julkisen salauksen algoritmeja (RSA, ECDSA, jne.) voisi käyttää myös tiedoston salaamiseen. Se on kuitenkin tehotonta ja käytäntönä huono. Yleensä salataankin symmetrisen salausalgoritmin kertakäyttöinen salasana julkisen salauksen algoritmeilla ja varsinainen tieto salataan symmetrisillä algoritmeilla, kuten AES:lla.
Lisäksi periaatteessa allekirjoituksen ja salauksen pystyy tulostiedostoineen yhdistämään yhdeksi operaatioksi. Koska kaikkia toiminnallisuuksia ei aina kaivata, on ehkä kuitenkin havainnollisinta suorittaa vaiheet erillisinä.
Salaaminen
Ensimmäiseksi hankitaan kohteen varmenne ja tarkistetaan sen aitous ja voimassaolo. Jos varmenne on väärennetty, väärentäjä pystyy purkamaan salauksen, salaamaan tiedoston uudelleen ja lähettämään sen edelleen vastaanottajalle. Jos vastaanottaja ei tarkasta vastaavalla menetelmällä lähettäjää, vihamielinen taho ei jää koskaan kiinni.
$ openssl verify -verbose -crl_download -crl_check -CAfile cacert.pem vastaanottaja.pem
vastaanottaja.crt: OK
Puretaan varmenteesta vastaanottajan julkinen avain, koska OpenSSL:n salausoperaatiot eivät osaa lukea sitä suoraan varmenteesta.
$ openssl x509 -pubkey -noout -in vastaanottaja.pem > vastaanottaja_pubkey.pem
Luodaan uusi 32-tavua (256-bittiä) pitkä satunnainen merkkijono, jota käytetään tiedoston salaamiseen AES-algoritmilla.
$ openssl rand -base64 32 > key.bin
Allekirjoitetaan salausavain lähettäjän yksityisellä avaimella. Sen jälkeen salataan sekä allekirjoitus että AES-salausavain siten, että vain vastaanottaja pystyy purkamaan niiden salauksen.
$ openssl pkeyutl -sign -in key.bin -inkey mikko.pem -out key.bin.signature -pkeyopt digest:sha512 -pkeyopt rsa_padding_mode:pkcs1
$ openssl pkeyutl -encrypt -inkey vastaanottaja_pubkey.pem -pubin -in key.bin.signature -out key.bin.signature.enc -pkeyopt digest:sha512 -pkeyopt rsa_padding_mode:pkcs1
$ openssl pkeyutl -encrypt -inkey vastaanottaja_pubkey.pem -pubin -in key.bin -out key.bin.enc -pkeyopt digest:sha512 -pkeyopt rsa_padding_mode:pkcs1
Allekirjoitus on jälleen mahdollista suorittaa tiedostovarmenteiden käytön sijaan PKCS#11-pohjaisella laitteella.
$ pkcs11-tool --module /usr/lib64/libcryptoki.so --login --sign --id 45 --input key.bin --output key.bin.signature --signature-format openssl --slot 2 -m SHA512-RSA-PKCS
Logging in to "Organisaatiokortti (PIN2)".
Please enter User PIN:
Using signature algorithm SHA512-RSA-PKCS
Salataan kohdetiedosto esimerkki.txt, käyttäen salausalgoritmina AES-256:tä CBC (Chained Block Cipher) -tilassa. Avaimena käytetään aiemmin luotua satunnaista merkkijonoa.
$ openssl enc -aes-256-cbc -salt -in esimerkki.txt -out esimerkki.txt.enc -pass file:./key.bin
Salattu tiedosto on tiedostossa esimerkki.txt.enc, salattu AES-salausavain tiedostossa key.bin.enc ja salausavaimen salattu allekirjoitus tiedostossa key.bin.signature.enc. Ne voi lähettää vastaanottajalle sellaisenaan, koska tiedostojen sisältö on suojattu salauksella. Lähettämisen jälkeen voidaan poistaa syntyneet tiedostot, ellei niitä haluta jostain erityisestä syystä säilöä.
$ rm key.bin key.bin.signature key.bin.signature.enc esimerkki.txt.enc
Salauksen purkaminen
Vastaanottaja purkaa AES-salausavaimen ja allekirjoituksen salauksen yksityisellä avaimellaan.
$ openssl pkeyutl -decrypt -inkey id_rsa.pem -in key.bin.enc -out key.bin -pkeyopt digest:sha512 -pkeyopt rsa_padding_mode:pkcs1
$ openssl pkeyutl -decrypt -inkey id_rsa.pem -in key.bin.signature.enc -out key.bin.signature -pkeyopt digest:sha512 -pkeyopt rsa_padding_mode:pkcs1
Salaus voidaan jälleen vaihtoehtoisesti purkaa PKCS#11-pohjaisella laitteella.
$ pkcs11-tool --module /usr/lib64/libcryptoki.so --login --decrypt --id 45 --input key.bin.enc --output key.bin --slot 1
Tämän jälkeen vastaanottaja voi tarkastaa, että lähettäjän varmenne on aito ja voimassa, ottaa sen julkisen avaimen ulos ja tarkastaa avaintiedoston allekirjoituksen.
$ openssl verify -verbose -crl_download -crl_check -CAfile cacert.pem lahettaja.pem
lahettaja.crt: OK
$ openssl x509 -pubkey -noout -in lahettaja.pem > lahettaja_pubkey.pem
$ openssl pkeyutl -verify -in key.bin -sigfile key.bin.signature -pubin -inkey lahettaja_pubkey.pem
Signature Verified Successfully
Salaus puretaan käyttäen aiemmin purettua salausavain-tiedostoa.
$ openssl enc -d -aes-256-cbc -in esimerkki.txt.enc -out esimerkki.txt -pass file:./key.bin