Questo documento descrive come divenire una certification authority (CA) usando il pacchetto OpenSSL. Nelle vesti di CA è possibile firmare ed installare certificati da usare sui propri server per applicazioni come Apache e Stunnel.
Questo documento è limitato ad un preciso scopo: prevenire che browser, mail client ed altri programmi si lamentino dei certificati installati sui propri server.
Non verrà presa in considerazione la modalità di trattare CA commerciali mentre ci si focalizzerà sul divenire una CA e firmare i propri certificati.
Le procedure che seguono sono state eseguite utilizzando OpenSSL 0.9.8e su una macchina Gentoo Linux.
Perché divenire una CA? Perché si possa trarre vantaggio dalla sicurezza offerta da SSL senza spendere soldi non necessari per avere un proprio certificato firmato da una CA commerciale.
Uno svantaggio è che i browser continueranno a protestare che il sito non è sicuro finché il vostro certificato principale non verrà importato. Comunque una volta importato, non ci sarà differenza dalle CA commerciali.
Ipotetici clienti e visitatori importeranno il nostro certificato principale solo se si fidano di noi. E' qui che entrano in gioco le CA commerciali, il cui scopo è di ricercare le persone e organizzazioni per firmare i loro certificati. Importando i loro certificati noi ci fidiamo del fatto che loro garantiscono che qualcuno è chi dice di essere. Si possono aggiungere altri certificati CA importando i loro certificati principali.
Se si possiede un esercizio commerciale accessibile via rete e si necessita di una connessione sicura, la sola scelta realistica è di ottenere un certificato firmato da una CA commerciale.
L'unico prerequisito richiesto è di avere installato il pacchetto OpenSSL sulla propria macchina. Se non fosse già installato basta dare il comando:
# emerge openssl
Nota: a scopo didattico non si userà la directory creata in fase di installazione /etc/ssl e verrà utilizzato il comando openssl per la generazione dei certificati. Comunque in /etc/ssl/misc è presente uno script chiamato CA.pl che facilita la creazione dei certificati basandosi esclusivamente sul file di configurazione /etc/ssl/openssl.cnf. Per completezza, accanto ai comandi per la generazione dei certificati verrà posto anche il rispettivo comando CA.pl le qui richieste sono del tutto uguali al comando openssl. Sottolineo ancora che CA.pl si basa esclusivamente sul file di configurazione presente in /etc/ssl.
Si creino le seguenti directory nella propria home directory:
# mkdir CA # cd CA # mkdir newcerts private
La directory CA conterrà:
La directory CA/newcerts conterrà:
La directory CA/private conterrà:
Questa chiave è estremamente importante:
Il prossimo step è creare un database per i certificati che verranno firmati:
# echo '01' >serial # touch index.txt
Piuttosto che usare il file di configurazione fornito dal pacchetto OpenSSL, se ne creerà uno nuovo con una configurazione minimale nella directory appena creata. Usare il proprio editor preferito (vi, pico, …) e creare un openssl.cnf di base:
# # OpenSSL configuration file. # # Establish working directory. dir = .
Con OpenSSL, la maggior parte di cosa finisce in un certificato dipende dal contenuto del file di configurazione piuttosto che dalla linea di comando. Questo è molto comodo data la quantità di cose da specificare.
Il file di configurazione è diviso in sezioni che sono lette e processate selettivamente in accordo con gli argomenti della linea di comando di openssl. Le sezioni possono includere una o più sottosezioni che vi fanno riferimento, il che rende il file di configurazione molto modulare. Ogni sezione inizia con un nome tra parentesi quadre, p.e. [req].
Occorre ora aggiungere una sezione che controlli come verranno creati i certificati ed una che definisca il tipo di certificato da creare.
La prima cosa da specificare è il Distinguished Name che identifica il proprietario del certificato quando questo verrà esaminato. Non è direttamente referenziato nel file di configurazione, ma viene incluso nella sezione presa in considerazione durante la creazione di una richiesta di certificato. Il comando è openssl req <args>, per questo la sezione viene chiamata [ req ].
Aggiungere le seguenti righe a openssl.cnf:
[ req ] default_bits = 1024 # Size of keys default_keyfile = key.pem # name of generated keys default_md = md5 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name [ req_distinguished_name ] # Variable name Prompt string #---------------------- ---------------------------------- 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Default values for the above, for consistency and less typing. # Variable name Value #------------------------------ ------------------------------ 0.organizationName_default = Gentoo.IT localityName_default = Firenze stateOrProvinceName_default = Italia countryName_default = IT [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always
Per proteggere noi stessi da un uso non autorizzato, il certificato CA viene protetto da una passphrase (una password che può essere anche un'intera frase, spazi compresi). Ogni volta che verrà usato il certificato CA per firmare le richieste, verrà chiesto l'inserimento di questa passphrase. E' quindi il momento buono per pensare ad una frase di difficile interpretazione per poi riporla in un luogo sicuro.
E' tutto pronto per creare il certificato principale auto firmato. Per questo verranno sovrascritti alcuni parametri predefiniti del file di configurazione attraverso la linea di comando.
Quello che verrà sovrascritto col comando openssl req è:
(Una nota sui termini della validità di un certificato principale: quando un certificato principale scade, tutti i certificati firmati con esso non sono più validi. Per correggere tale situazione, deve essere creato e distribuito un nuovo certificato principale. Anche tutti i certificati firmati precedentemente devono essere revocati e firmati col nuovo CA. Dato che questo può essere un grosso lavoro, si può rendere il certificato principale valido il più a lungo possibile secondo le proprie necessità. Nel nostro esempio lo si renderà valido dieci anni.)
Eseguire il seguente comando (in questo caso verrà richiesto l'inserimento della PEM pass phrase due volte per la sua creazione):
# openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf (oppure /etc/ssl/misc/CA.pl -newca) Using configuration from ./openssl.cnf Generating a 1024 bit RSA private key .......++++++ ..........................++++++ writing new private key to 'private/cakey.pem' Enter PEM pass phrase:demo Verifying password - Enter PEM pass phrase:demo ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Organization Name (company) [Gentoo.IT]:<enter> Organizational Unit Name (department, division) []:<enter> Email Address []:ca@gentoo.it Locality Name (city, district) [Firenze]:<enter> State or Province Name (full name) [Italia]:<enter> Country Name (2 letter code) [IT]:<enter> Common Name (hostname, IP, or your name) []:Enrico Morelli
Questo processo produce due file:
cacert.pem è il file da distribuire ai clienti.
La chiave privata (cakey.pem) si presenta come segue:
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,0947F49BB28FE5F4 jlQvt9WdR9Vpg3WQT5+C3HU17bUOwvhp/r0+viMcBUCRW85UqI2BJJKTi1IwQQ4c tyTrhYJYOP+A6JXt5BzDzZy/B7tjEMDBosPiwH2m4MaP+6wTbi1qR1pFDL3fXYDr ZsuN08dkbw9ML6LOX5Rl6bIBL3i5hnGiqm338Fl52gNstThv0C/OZhXT3B4qsJn8 qZb3mC6U2nRaP/NpZPcEx4lv2vH7OzHTu1TZ7t0asSpgpuH58dfHPw775kZDep2F LXA3Oeavg0TLFHkaFBUx2xaeEG6Txpt9I74aAsw1T6UbTSjqgtsK0PHdjPNfPGlY 5U3Do1pnU9hfoem/4RAOe0cCovP/xf6YPBraSFPs4XFfnWwgEtL09ReFqO9T0aSp 5ajLyBOYOBKQ3PCSu1HQDw/OzphInhKxdYg81WBBEfELzSdMFQZgmfGrt5DyyWmq TADwWtGVvO3pEhO1STmCaNqZQSpSwEGPGo5RFkyFvyvyozWX2SZg4g1o1X40qSg9 0FMHTEB5HQebEkKBoRQMCJN/uyKXTLjNB7ibtVbZmfjsi9oNd3NJNVQQH+o9I/rP wtFsjs+t7SKrsFB2cxZQdDlFzD6EBA+5ytebGEI1lJHcOUEa6P+LTphlwh/o1QuN IKX2YKHA4ePrBzdgZ+xZuSLn/Qtjg/eZv6i73VXoHk8EdxfOk5xkJ+DnsNmyx0vq W53+O05j5xsxzDJfWr1lqBlFF/OkIYCPcyK1iLs4GOwe/V0udDNwr2Uw90tefr3q X1OZ9Dix+U0u6xXTZTETJ5dF3hV6GF7hP3Tmj9/UQdBwBzr+D8YWzQ== -----END RSA PRIVATE KEY-----
Il certificato (cacert.pem) si presente come segue:
-----BEGIN CERTIFICATE----- MIIDrTCCAxagAwIBAgIBADANBgkqhkiG9w0BAQQFADCBnDEbMBkGA1UEChMSVGhl IFNhbXBsZSBDb21wYW55MRQwEgYDVQQLEwtDQSBEaXZpc2lvbjEcMBoGCSqGSIb3 DQEJARYNY2FAc2FtcGxlLmNvbTETMBEGA1UEBxMKTWV0cm9wb2xpczERMA8GA1UE CBMITmV3IFlvcmsxCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtUU0MgUm9vdCBDQTAe Fw0wMTEyMDgwNDI3MDVaFw0wMjEyMDgwNDI3MDVaMIGcMRswGQYDVQQKExJUaGUg U2FtcGxlIENvbXBhbnkxFDASBgNVBAsTC0NBIERpdmlzaW9uMRwwGgYJKoZIhvcN AQkBFg1jYUBzYW1wbGUuY29tMRMwEQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQI EwhOZXcgWW9yazELMAkGA1UEBhMCVVMxFDASBgNVBAMTC1RTQyBSb290IENBMIGf MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDaiAwfKB6ZBtnTRTIo6ddomt0S9ec0 NcuvtJogt0s9dXpHowh98FCDjnLtCi8du6LDTZluhlOtTFARPlV/LVnpsbyMCXMs G2qpdjJop+XIBdvoCz2HpGXjUmym8WLqt+coWwJqUSwiEba74JG93v7TU+Xcvc00 5MWnxmKZzD/R3QIDAQABo4H8MIH5MAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFG/v yytrBtEquMX2dreysix/MlPMMIHJBgNVHSMEgcEwgb6AFG/vyytrBtEquMX2drey six/MlPMoYGipIGfMIGcMRswGQYDVQQKExJUaGUgU2FtcGxlIENvbXBhbnkxFDAS BgNVBAsTC0NBIERpdmlzaW9uMRwwGgYJKoZIhvcNAQkBFg1jYUBzYW1wbGUuY29t MRMwEQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQIEwhOZXcgWW9yazELMAkGA1UE BhMCVVMxFDASBgNVBAMTC1RTQyBSb290IENBggEAMA0GCSqGSIb3DQEBBAUAA4GB ABclymJfsPOUazNQO8aIaxwVbXWS+8AFEkMMRx6O68ICAMubQBvs8Buz3ALXhqYe FS5G13pW2ZnAlSdTkSTKkE5wGZ1RYSfyiEKXb+uOKhDN9LnajDzaMPkNDU2NDXDz SqHk9ZiE1boQaMzjNLu+KabTLpmL9uXvFA/i+gdenFHv -----END CERTIFICATE-----
Si possono richiedere diverse informazioni legate al contenuto di questo certificato usando openssl, da chi proviene, quanto è valido, ecc:
# openssl x509 -in cacert.pem -noout -text # openssl x509 -in cacert.pem -noout -dates # openssl x509 -in cacert.pem -noout -purpose
Una volta creato il certificato principale, si può create qualsiasi numero di certificato per installarli nelle applicazione SSL come https, spop o simap. La procedura coinvolge la creazione di una chiave privata e di un certificato per la richiesta e quindi la firma della richiesta per generare il certificato vero e proprio.
Il file di configurazione necessita di alcune definizioni in più per create certificati non CA. Aggiungere quanto segue alla fine del file:
[ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash
Per evitare di dover ripetutamente inserire questo da linea di comando, aggiungere le seguenti righe alla sezione [ req ] dopo la riga distinguished_name:
distinguished_name = req_distinguished_name req_extensions = v3_req
Ora siamo pronti a creare il nostro primo certificato per la richiesta della firma. In questo esempio si creerà un certificato per un server POP sicuro con indirizzo mail.gentoo.it. La procedura è molto simile alla creazione di un certificato CA, ma tre richieste necessitano di differenti risposte.
il Common Name deve essere il nome del server completo di dominio che i clienti useranno per contattare l'host. Se questo non corrisponde, ogni volta che i clienti si connetteranno verrà loro richiesto se vogliono usare questo server. In effetti il software mostrerà il seguente messaggio di avvertimento del tipo “Attenzione! Si è richiesto la visualizzazione di mail.gentoo.it; il certificato di risposta della macchina è per smtp.gentoo.it. Sei sicuro di voler continuare?”
# openssl req -new -nodes -out req.pem -config ./openssl.cnf (oopure /etc/ssl/misc/CA.pl -newreq) ... Organizational Unit Name (department, division) []:Mail Server Email Address []:postmaster@gentoo.it Common Name (hostname, IP, or your name) []:mail.gentoo.it ...
Questo processo produce due file:
Questi file dovrebbero venire mantenuti in quanto quando il certificato scade, la richiesta può venire nuovamente utilizzata per creare un nuovo certificato con una nuova data di scadenza. La chiave privata è necessaria alla codifica SSL. Quando si salvano questi file può aiutare il chiamarli in un modo più significativo, per esempio mailserver.key.poem e mailserver.req.pem.
Il certificato con richiesta di firma si presenta come segue:
----BEGIN CERTIFICATE REQUEST----- MIICJDCCAY0CAQAwgagxGzAZBgNVBAoTElRoZSBTYW1wbGUgQ29tcGFueTEUMBIG A1UECxMLTWFpbCBTZXJ2ZXIxJDAiBgkqhkiG9w0BCQEWFXBvc3RtYXN0ZXJAc2Ft cGxlLmNvbTETMBEGA1UEBxMKTWV0cm9wb2xpczERMA8GA1UECBMITmV3IFlvcmsx CzAJBgNVBAYTAlVTMRgwFgYDVQQDEw9tYWlsLnNhbXBsZS5jb20wgZ8wDQYJKoZI hvcNAQEBBQADgY0AMIGJAoGBAPJhc++WxcBaoDbJpzFbDg42NcOz/ELVFMU4FlPa yUzUO+xXkdFRMPKo54d4Pf1w575Jhlu9lE+kJ8QN2st6JFySbc9QjPwVwl9D2+I3 SSf2kVTu+2Ur5izCPbVAfU0rPZxxK8ELoOkA1uwwjFz6EFuVvnHwlguonWKDtmYW u7KTAgMBAAGgOzA5BgkqhkiG9w0BCQ4xLDAqMAkGA1UdEwQCMAAwHQYDVR0OBBYE FLWaQsUVIQzWr58HtDinH1JfeCheMA0GCSqGSIb3DQEBBAUAA4GBAAbe0jrGEQ3i tyVfy5Lg4/f69rKvDGs+uhZJ9ZRx7Dl92Qq2osE7XrLB1bANmcoEv/ORLZOjWZEY NjMvuz60O7R8GKBrvb/YhAwWhIIt2LJqPkpAEWS0kY0AkoQcfZ7h6oC35+eJ7okg Uu3WuE57RgcNt7/ftr0sG1jUyRwMLvhv -----END CERTIFICATE REQUEST-----
Per vedere se il contenuto della richiesta è corretto eseguire:
# openssl req -in req.pem -text -verify -noout
Si deve ora aggiungere al file di configurazone una sezione che si occupi della CA. Questa sezione identificherà i percorsi dei vari pezzi come il database, il certificato CA e la chiave privata. Fornisce inoltre alcuni valori predefiniti di base. Inserire ciò che segue in openssl.cnf dopo la sezione [ req ]:
[ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem private_key = $dir/private/cakey.pem default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
Per firmare la richiesta eseguire il seguente comando e rispondere alle richieste. Notare che alla richiesta della PEM passphrase occorre inserire quella precedentemente creata:
# openssl ca -out cert.pem -config ./openssl.cnf -infiles req.pem (oppure /etc/ssl/misc/CA.pl -signreq) Using configuration from ./openssl.cnf Enter PEM pass phrase:demo Check that the request matches the signature Signature ok The Subjects Distinguished Name is as follows organizationName :PRINTABLE:'Gentoo.IT' organizationalUnitName:PRINTABLE:'Mail Server' emailAddress :IA5STRING:'postmaster@gentoo.it' localityName :PRINTABLE:'Firenze' stateOrProvinceName :PRINTABLE:'Italia' countryName :PRINTABLE:'IT' commonName :PRINTABLE:'mail.gentoo.it' Certificate is to be certified until Dec 8 04:37:38 2002 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
Questo processo aggiorna il il database della CA e produce due file:
Si può esaminare il certificato:
# openssl x509 -in cert.pem -noout -text -purpose | more
Il certificato ha sia la versione codificata che quella leggibile nello stesso file. Si può elminare la porzione leggibile come segue:
# mv cert.pem tmp.pem # openssl x509 -in tmp.pem -out cert.pem
Questo dipende dall'applicazione, alcune vogliono la chiave ed il certificato nello stesso file, altre in file separati. Combinarle assieme è facile:
# cat key.pem cert.pem >key-cert.pem
Dopo questo passo, si hanno tre componenti installabili tra cui scegliere:
Copiare il file opportuno nella locazione specificata dalle istruzioni dell'applicazione.
Apache possiede direttive di configurazione separate per la chiave ed il certificato, per cui si devono mantenere ognuna nel proprio file. Questi file dovrebbero essere tenuti fuori dalla DocumentRoot e relative sottodirectory, per questo un struttura ragionevole potrebbe essere:
File Commento /home/httpd/html Apache DocumentRoot /home/httpd/ssl File SSL correlati /home/httpd/ssl/cert.pem Certificato del sito /home/httpd/ssl/key.pem Chiave privata del sito
All'interno della direttiva <VirtualHost> per il sito (che dovrebbe naturalmente rispondere sulla porta 443), includere le direttive che puntatno a questi file:
<VirtualHost 192.168.1.1:443> ServerName mail.gentoo.it DocumentRoot /home/httpd/html ... altre direttive per questo sito ... SSLEngine on SSLLog /var/log/ssl_engine_log SSLCertificateFile /home/httpd/ssl/cert.pem SSLCertificateKeyFile /home/httpd/ssl/key.pem </VirtualHost>
stunnel viene usato come un wrapper SSL per servizi normalmente non sicuri come IMAP e POP. Accetta come argomenti (insieme ad altre cose) il servizio da eseguire e la locazione del certificato e della chiave privata.
La chiave ed il certificato sono nello stesso file. Questi possono essereposti ovunque, ma la locazione migliore potrebbe essere /etc/ssl/certs. Specificare questo nella linea di comando di stunnel:
stunnel -p /etc/ssl/certs/key-cert.pem <altri argomenti...>
Finalmente è giunto il momento di fermare le lamentele dei clienti per i certificati non sicuri. Inviare cacert.pem a chiunque voglia usare i vostri server sicuri cosicché possano installarli nei propri browser, mail client, ecc, come un certificato principale.
La catena dei certificati può rompersi a causa della scadenza del certificato in due modi:
Il secondo caso presuppone molto lavoro da fare. Deve essere creato e distribuito un nuovo certificato CA e i certificati firmati col vecchio CA devono venire ricreati o rinnovati.
Nel primo caso ci sono due opzioni. Si può sia rigenerare un nuovo certificato con richiesta di firma e firmarlo come descritto in precedenza o (se lo si è tenuto) rifirmare la richiesta originale. In entrambi i casi i vecchi certificati devono essere revocati ed i nuovi devono essere installati al posto dei vecchi.
Non si possono creare due certificati con lo stesso Common Name ecco il perché il certificato scaduto deve anche essere revocato. IL certificato è nella directory newcerts e si può determinare il suo filename sfogliando index.txt e cercandovi il Common Name (CN). il filename è l'indice più l'estensione ”.pem”, per esempio “02.pem”. Per revocare il certificato:
# openssl ca -revoke newcerts/02.pem -config ./openssl.cnf Using configuration from ./openssl.cnf Enter PEM pass phrase: demo Revoking Certificate 02. Data Base Updated
Ora che il certificato è stato revocato si può firmare la richiesta originale o crearne e firmarne uno nuovo.
Il processo è basilarmente lo stesso che si è visto sino a qui eccetto per il fatto che la CA fa molto del lavoro. Noi dobbiamo solo generare il certificato con richiesta di firma come mostrato in precedenza e sottometterlo per la firma. Si riceverà in seguito il certificato firmato per l'installazione.
Questi certificati verranno automaticamente considerati fidati dai browser dato che quest'ultimo ha il certificato della CA commerciale già nella propria lista. Non c'è niente da distribuire.
La configurazione descritta qui può non essere adeguata per questo scopo e ci possono essere più cose da aggiungere nella richiesta. Differenti autorità certificanti è possono richiedere caratteristiche differenti nel certificato da firmare. Ma tutto ciò esula da questa guida.
Si può mettere il certificato sul proprio sito web per il download. In questo caso si dovrebbe mettere anche la Certificate Revocation List (CRL) ed il mezzo per mostrare un certificato fornendo il suo numero seriale. Anche questo esula da questa guida.
Apache serve l certificato in una forma comprensibile ai browser se si specifica il suo tipo MIME. Per esempio si può usare come estensione del file “.crt” per certificati scaricabili e mettere ciò che segue nella sezione generale della configurazione di Apache:
AddType application/x-x509-ca-cert .crt
Si può quindi creare il link per scaricare il proprio certificato come **<a href=“www.gentoo.it/rootcert.crt”>Il nostro certificato</a>. Quando un visitatore selezionerà il link, il browser chiederà se si vuole installare il certificato.
Una CRL si può generare come segue:
# openssl ca -gencrl -crldays 31 -config ./openssl.cnf -out rootca.crl