Gestione di una rootca con OpenSSL Versione 2.0 Data ultima rev. 17/11/2007 Redatto da Bejelith aka petabyte Tipo documento Manuale di amministrazione Nome doc. Gestione di una rootca.doc - pag. 1/10 -
Contenuto del documento 1 - Prefazione... 3 2 - Installazione... 4 3 - Gestione della CA... 4 3.1 - Configurazione...5 3.2 - Generazione del certidicato self-signed...5 3.2.1 - Compilazione dei parametri... 6 3.2.2 - Riepilogo... 6 4 - I certificati... 7 4.1 - Generare la richiesta...8 4.2 - Firmare la richiesta...8 4.2.1 - Riepilogo... 8 5 - Conversioni e formati... 9 5.1 - Da PEM a PKCS12...9 5.1.1 - Riepilogo... 9 6 - Posta elettronica ed S/MIME... 10 - pag. 2/10 -
1 - Prefazione Il documento descrive la creazione di una rootca, delle relative chiavi, certificati PEM, export degli stessi in formato DER e PKCS12 secondo la struttura PKI (Public Key infrastructure) illustrata in Figura 1. Figura 1 - pag. 3/10 -
2 - Installazione L unico pacchetto necessario al sistema è OpenSSL installabile con: #yum install openssl Per windows è disponibile il pacchetto d installazione scaricabile da www.openssl.org. 3 - Gestione della CA Per prima cosa creare una directory ROOT ove sarà creata la CA ed i certificati: #mkdir ROOT #cd ROOT #chmod 700. Creare la directory della CA: #mkdir CA #mkdir CA/private Creiamo indice e seriale: #cd CA #echo '100001' > serial #touch certindex.txt Impostiamo i diritti: #cd.. #chmod 700./ -R - pag. 4/10 -
3.1 - Configurazione Creare il file di configurazione della CA in./ssl.cnf #Conf rootca dir =. [ ca ] default_ca = CA_default [ CA_default ] serial = $dir/ca/serial database = $dir/ca/certindex.txt new_certs_dir =. certificate = $dir/ca/cacert.pem private_key = $dir/ca/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 stateorprovincename organizationname organizationalunitname commonname emailaddress = match = match = match = optional = supplied = optional [ req ] default_bits = 2048 # 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_extensions = v3_req [ req_distinguished_name ] 0.organizationName = Organization Name (company) 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. 0.organizationName_default = My Company localityname_default = My Town stateorprovincename_default = State or Providence countryname_default = US [ v3_ca ] basicconstraints subjectkeyidentifier authoritykeyidentifier [ v3_req ] basicconstraints subjectkeyidentifier subjectaltname = CA:TRUE = hash = keyid:always,issuer:always = CA:FALSE = hash = DNS:host.domain.it 3.2 - Generazione del certidicato self-signed Dalla directory ROOT eseguire: - pag. 5/10 -
# openssl req -new -x509 -extensions v3_ca -keyout CA/private/cakey.pem\ -out CA/cacert.pem -config ssl.cnf 3.2.1 - Compilazione dei parametri Il programma chiederà alcuni parametri: 1. Enter PEM pass phrase Qui andrà inserita una password per crittare la chiave privata della CA 2. Verifying - Enter PEM pass phrase Conferma del punto precedente 3. Organization Name (company) Inserire la Società che gestisce la CA 4. Organizational Unit Name Inserire un Unità Organizzativa 5. Email Address Un email di riferimento per il certificato 6. Locality Name Il nome della città ove il certificato è creato 7. State or Province Name Lo stato d appartenenza 8. Country Name Il codice dello stato prima inserito (Italy/IT, USA/US, ) 9. Common Name Un nome comune, ad esempio un URL se il certificato sarà utilizzato per un sito web. 3.2.2 - Riepilogo CA/cacert.pem Certificato della CA, contiene la chiave pubblica della CA. Deve essere distributi presso tutti i client che dovranno accettare i certificati da esso firmati. CA/private/cakey.pem Chiave privata della CA, permette di firmare ulteriori certificati. - pag. 6/10 -
4 - I certificati I certificati vengono generati seguento lo standard dettato dalla struttura PKI seguendo i seguenti passaggi illustrati in figura. 1. Il richiedente di un certificato (cioè la combinazione tra le due chiavi personali ed una firma di una Certification Authority), 2. genera una richiesta di certificazione da inoltrare alla CA, 3. la CA si occupera di apporre la propia firma e restiture così la richiesta firmata (Certificato) al richiedente. - pag. 7/10 -
4.1 - Generare la richiesta Per generare una richiesta generica, ad esempio un certificato client, creiamo una directory destinata a contenere i file ad esso relativi: #mkdir client1 Quindi procediamo alla generazione della richiesta: # openssl req -new -nodes -out client1/richiesta-client1.pem keyout\ client1/chiaveprivata-client1.pem -config ssl.cnf In questo caso non verrà chiesta la crittografia della chiave privata, se al contrario si desidera crittografarla è necessario omettere il parametro nodes dal comando precedente. Per compilare i parametri richiesti fare riferimento al paragrafo 3.2.1, assicurarsi di inserire il medesimo Organization Name inserito nella CA. 4.2 - Firmare la richiesta Eseguire il seguente comando per firmare la richiesta di client1: # openssl ca -out client1/cert-client1.pem -config ssl.cnf -extensions v3_req -infiles client1/richiesta-client1.pem Enter pass phrase for./ca/private/cakey.pem: Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows organizationname :PRINTABLE:'Datanet sc' organizationalunitname:printable:'dnet' localityname :PRINTABLE:'Siracusa' stateorprovincename :PRINTABLE:'Italy' countryname :PRINTABLE:'IT' commonname :PRINTABLE:'client1' Certificate is to be certified until Oct 30 11:06:29 2008 GMT (365 days) Sign the certificate? [y/n]:y Il software chiederà la pass phrase della chiave privata della CA, successivamente visualizzerà i dati della richiesta e chiederà se generare o meno il certificato. IMPORTANTE: Nel comando per firmare una request specificare sempre le estensioni SSL della richiesta stessa altrimenti andranno perse. (-extensions v3_req) 4.2.1 - Riepilogo client1/richiesta-client1.pem client1/ chiaveprivata-client1.pem client1/cert-client1.pem Richiesta di certificazione, in praticamente si tratta di un certificato non firmato da alcuna CA. Contiene la chiave pubblica. Chiave privata della richiesta. Certificato di client1. Contiene la firma della CA e la chiave publica di client1. - pag. 8/10 -
5 - Conversioni e formati E spesso necessario esportare i certificati PEM (Contenendi generalmente solo la firma della CA e la chiave publica) in pacchetti di chiavi JKS o in formato PKCS12. I pacchetti JKS sono detti Key Store, infatti essi non sono altro che contenitori di certificati. Il formato PKCS12 è invece permette lo spostamento di un certificato completo di chiave pubblica e privata con la firma della CA, sempre crittografato da una chiave univoca DES, esso è utile per installare i certificati in ambienti ove sono necessario entrambe le chiavi del certificato, ad esempio server web, ftp etc.. oppure, lato client, servono ad installare i certificati personali su clienti di posta, ftp etc. Il formato PKCS7 è invece utilizzato per lo spostamento solo della chiave publica, in pratica è il formato tramite il quale i messaggi email S/MIME sono firmati e/o crittografati. 5.1 - Da PEM a PKCS12 Con l utility pkcs12 di openssl è possibile effettuare tale conversione come mostrato dal comando di seguito: # openssl pkcs12 -export -in client1/cert-client1.pem -inkey client1/chiaveprivata-client1.pem -certfile CA/cacert.pem -name "Nome Comune" -out client1/certificato-client1.p12 Il file certificato-client1.p12 è così importabile presso tutte le applicazioni client ad esempio outlook o thunderbird per poter firmare e/o crittografare i messaggi email. 5.1.1 - Riepilogo client1/richiesta-client1.pem client1/ chiaveprivata-client1.pem client1/cert-client1.pem client1/certificato-client1.p12 Richiesta di certificazione, in praticamente si tratta di un certificato non firmato da alcuna CA. Contiene la chiave pubblica. Chiave privata della richiesta. Certificato di client1. Contiene la firma della CA e la chiave publica di client1. Certificato in formato pkcs12 - pag. 9/10 -
6 - Posta elettronica ed S/MIME Prendiamo ad esempio lo scenario un cui l utente Mario e l utente Giuseppe devono scambiarsi dei messaggi di posta elettronica firmati e crittografati. Assumiamo che entrambi gli utenti abbiamo i solo certificati rilasciati da una CA o più CA, in formato PKCS12. Ricevuti i file PKCS12 (.p12) è necessario procedere all import degli stessi sui client di posta dei rispettivi utenti. Fatto questo è necessario effettuare la distribuzione delle chiavi publiche: l utente Mario, ricevuta la chiave di Giuseppe, critterà i messaggi per Giuseppe, viceversa, Giuseppe, ricevuta la chiave da Mario sarà in grado di crittare i messaggi verso lui. Lo scambio è molto semplice da effettuare, l utente Mario creerà un nuovo messaggio di posta ed impostarà, nel client di posta stesso, di firmare il messaggi senza crittografarlo; in questo modo il client ellegherà alla mail la chiave pubblica dell utente in formato PKCS7. Giuseppe ricevendo da Mario tale messaggio con firma elettronica non dovrà fare altro che installare tale firma e inviare a sua volta un messaggio di posta firmato ma non crittografato all altro utente. Da questo momento, installate le rispettive chiavi publiche, entrambi saranno capaci di crittare i messaggi con le chiavi publiche del destinatario, e solo il destinatario potrà leggere tali messaggi con la propria chiave privata. - pag. 10/10 -