Tekn.dr. Göran Pulkkis Överlärare i Datateknik Avancerad SSL-programmering III 9.2.2012 1 Innehåll Dataformatet PKCS#7 och S/MIMEstandarden Signering av S/MIME-meddelanden och verifiering av signaturer Kryptering och avkryptering av S/MIME-meddelanden PKCS#12-standarden 9.2.2012 2
Dataformatet PKCS#7 och S/MIMEstandarden PKCS#7 är ett dataformat för S/MIME (Secure Multi-purpose Internet Mail Extensions). S/MIME är en specifik kodning av data i PKCS#7- format. E-postprogram förutsätter att e- postmeddelanden har denna kodning. OpenSSL stöder S/MIMEv2 och PKCS#7v1.5 9.2.2012 3 Skapa signerad PKCS#7-post PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, BIO *data, int flags); signcert pekare på signeringscertifikat pkey pekare på privat signeringsnyckel certs pekare på stack av certifikat, som tas med i den PKCS7-post som skapas av PKCS7_sign data härifrån hämtas data för signering, t.ex. från stdin eller från en fil flags flaggor för inställning av egenskaper hos den PKCS7-post som skapas av PKCS7_sign 9.2.2012 4
Skapa S/MIME-meddelande från PKCS7-post int SMIME_write_PKCS7(BIO *bio, PKC7 *p7, BIO *data, int flags); bio hit skickas S/MIME-meddelandet, t.ex. till en fil eller till stdout p7 pekare på post med PKCS7-data data härifrån hämta usprunglig, osignerad/okrypterad data, t.ex. från en fil eller från stdin flags flaggor för hantering av egenskaper hos p7 och bio 9.2.2012 5 Skapa PKCS7-post från SMIME-meddelande PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); bio härifrån hämtas ett S/MIME-meddelande, t.ex. Från stdin eller från en fil bcont pekare på adressen till den data, som finns i den PKCS7-post, som skapas av funktionen och utpekas av funktionens returvärde 9.2.2012 6
Verifiera signatur i PKCS7-post int PKCS7_verify(PKSC7 *p7, STACK OF(X509) *certs, X509_STORE *store, BIO *indata, BIO *out, int flags); p7 pekare på PKCS7-post som innehåller signerad data certs pekare på stack med de(t) certifikat, som används att verifiera signeringen store pekare på den X509_STORE-post, via vilken görs åtkomliga de CA-certifikat och den spärrlista, vilka används för att validera certifikaten i certs indata adressen till (=pekare på) den data, som finns i p7, dvs den adress som blir utpekad vid anrop av SMIME_read_PKCS7 out hit skickas signaturverifierat meddelande, t.ex. till en fil eller till stdout flags flaggor för hantering av egenskaper hos p7 9.2.2012 7 Signering av S/MIME-meddelanden och verifiering av signaturer Se exempelprogram EX10-8 i OpenSSL-boken 9.2.2012 8
Skapa krypterad PKCS#7-post PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, int flags); certs stack med certifikat, med vilkas publika nycklar data från in krypteras in härifrån hämtas data för kryptering, t.ex. från stdin eller från en fil cipher specifierar symmetrisk krypteringsalgoritm flags flaggor för inställning av egenskaper hos den PKCS7-post som skapas av PKCS7_encrypt 9.2.2012 9 Skapa S/MIME-meddelande från PKCS7-post int SMIME_write_PKCS7(BIO *bio, PKC7 *p7, BIO *data, int flags); bio hit skickas S/MIME-meddelandet, t.ex. till en fil eller till stdout p7 pekare på post med PKCS7-data data härifrån hämta usprunglig, osignerad/okrypterad data, t.ex. från en fil eller från stdin flags flaggor för hantering av egenskaper hos p7 och bio 9.2.2012 10
Skapa PKCS7-post från SMIME-meddelande PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); bio härifrån hämtas ett S/MIME-meddelande, t.ex. Från stdin eller från en fil bcont pekare på adressen till den data, som finns i den PKCS7-post, som skapas av funktionen och utpekas av funktionens returvärde 9.2.2012 11 Avkryptera data i PKCS7-post int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags); p7 pekare på PKCS7-post som innehåller krypterad data pkey pekare på post med privat avkrypteringsnyckel cert pekare på certifikat för public nyckel, som är par med pkey data hit skickas avkrypterat meddelande, t.ex. till en fil eller till stdout flags flaggor för hantering av egenskaper hos p7 9.2.2012 12
Kryptering och avkryptering av S/MIMEmeddelanden Se exempelprogram EX10-9 i OpenSSL-boken 9.2.2012 13 Användning av exempelprogrammen EX10-8 och EX10-9 Signering och kryptering: cat msg.txt EX10-8 sign sendkey.pem sendcert pem \ > EX10-9 encrypt recvcert.pem > msg.smime Skicka som e-post Inför i början av msg.smime följande tre textrader From: sender.name@domain1.fi To: receiver.name@domain2.fi Subject: Signed and encrypted message Från UNIX-dator med sendmail installerat cat msg.smime sendmail receiver.name@domain2.fi 9.2.2012 14
Användning av exempelprogrammen EX10-8 och EX10-9 Kommandoradhantering av mottaget signerat och krypterat meddelande cat msg.smime EX10-9 decrypt recvkey.pem recvcert.pem \ EX10-8 verify sendcert.pem klartextmeddelandet visas på skärmen 9.2.2012 15 PKCS7-flaggor Kan kombineras med bitvis or i heltalsvariabler PKCS7_NOINTERN signaturverifiering använder inte certifikat inbäddade i PKCS7-poster PKCS7_NOVERIFY signeringscertifikatet verifieras inte vid signaturverifiering PKCS7_NOCERTS inga extra certifikat införs i en skapad PKCS7-post PKCS7_DETACHED signeringscertifikatet tar ej med i PKCS7-post skapad vid signering PKCS7_NOSIGS verifiera inte signaturen i en PKCS7-post Notera datasäkerhetsriskerna förknippade med dessa flaggor! 9.2.2012 16
Skapa PKCS12-post PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter, int keytype); pass lösenfras för PKCS12-post name namn på certifierat nyckelpar i PKCS12-post ckey, cert pekare på poster med privat nyckel och certifikat för motsvarande publika nyckel ca pekare på stack av CA-certifikat övriga parametrar kan ha värdet 0 returvärdet utpekar en skapad PKCS12-post 9.2.2012 17 Spara PKCS12-post i DER-format int i2d_pkcs12_fp(file *fp, PKCS12 *p12); fp pekare på fil, som öppnats för inskrivning av data p12 pekare på PKCS12-post 9.2.2012 18
Skapa PKCS12-post från DER-fil PKCS12 *d2i_pkcs12_fp(file *fp, PKCS12 **p12); fp pekare på DER-fil, som öppnats för avläsning av data p12 kan ha värdet NULL, eftersom funktionen returnerar en pekare på skapad PKCS12-post. 9.2.2012 19 Skapa poster med privat nyckel, certifikat och CAcertifikatstack från PKCS12-post int PKCS12_parse(PKCS12 *p12, const char pass, EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca); Lösenfras behövs Adresser till skapade poster utpekas 9.2.2012 20