gianky.com ~ blog v.5.1.1 "Annalee"

Creare certificati SSL sotto Linux

Sabato 8 marzo 2008

Dato che la questione almeno una volta all'anno mi si presenta e regolarmente dimentico come si fa, riassumo a uso e consumo mio e di chi si trovasse nelle stesse condizioni come generare un'autorità di certificazione e relativi certificati per siti Web e posta elettronica sotto Linux.


A) Autorità di certificazione fatta in casa

1) Creare una directory

mkdir sslcert

1.1) Renderla accessibile solo all'utente corrente

chmod 0700 sslcert

2) Creare due subdirectory

cd sslcert
mkdir certs private

3) Creare il database dei certificati

echo '100001' >serial
touch certindex.txt

4) Creare un file di configurazione per openssl

vi openssl.cnf (o equivalente :-)

# Inizio file

#
# OpenSSL configuration file.
#

# Establish working directory.

dir = .

[ ca ]
default_ca = CA_default

[ CA_default ]
serial = $dir/serial
database = $dir/certindex.txt
new_certs_dir = $dir/certs
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

[ 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_extensions = v3_req

[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
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.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = My Company
localityName_default = My Town
stateOrProvinceName_default = State or Providence
countryName_default = US

[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always

[ v3_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash

# Fine file

5) Creare un certificato root

openssl req -new -x509 -extensions v3_ca -keyout \
private/cakey.pem -out cacert.pem -days 365 -config ./openssl.cnf

6) Installare il certificato

Eseguire il programma (browser, client e-mail, ecc.) e importare il file cacert.pem (forse anche rinominarlo come cacert.crt).


B) Certificato per sito Web fatto in casa

1) Vedi punto A

2) Creare una chiave e una richiesta

openssl req -new -nodes -out [name]-req.pem -keyout private/[name]-key.pem -config ./openssl.cnf

Per Common Name inserire il nome del server o il suo indirizzo IP.

Vengono creati due file: [name]-req.pem (la richiesta) e [name]-key.pem [la chiave privata nella directory private.

In alternativa, per esempio sotto IIS, utilizzare il metodo fornito con il server Web per creare la richiesta.

3) Firmare la richiesta

openssl ca -out [name]-cert.pem -config ./openssl.cnf -infiles [name]-req.pem

Vengono creati due file: [name]-cert.pem (il certificato) e [numero].pem (una copia nella directory certs.

4) Installare il certificato

Dipende dal server Web in uso. Per IIS importarlo usando lo stesso programma utilizzato per la richeista; per Apache:

cp [name]-key.pem /etc/httpd/conf/ssl.key/
cp [name]-cert.pem /etc/httpd/conf/ssl.crt/

e modificare il file di configurazione /etc/httpd/conf/apache.conf inserendo una sezione VirtualHost.


C) Certificato per posta elettronica fatto in casa

(Nota: per motivi che ancora non ho indagato, questa procedura non inserisce l'indirizzo di posta elettronica nel certificato; per il momento ho risolto usando il front.end TinyCA.)

1) Vedi punto A

2) Creare per ogni utente una chiave e una richiesta

openssl req -new -nodes -out [name]-req.pem -keyout private/[name]-key.pem -days 365 -config ./openssl.cnf

Al posto di [name] mettere il nome dell'utente.
Rispondere alle domande; è pratico mettere Cognome Nome come Common Name.
Vengono creati due file: [name]-req.pem (la richiesta) e [name]-key.pem la chiave privata nella directory private.

3) Firmare ogni richiesta

openssl ca -out [name]-cert.pem -days 365 -config ./openssl.cnf -infiles [name]-req.pem

Vengono creati due file: [name]-cert.pem (il certificato) e [numero].pem (una copia nella directory certs).

4 ) Creare il file PKCS12

openssl pkcs12 -export -in [name]-cert.pem -inkey private/[name]-key.pem -certfile cacert.pem -name "[Cognome Nome]" -out name-cert.p12

Mettere ovviamente il cognome e nome dell'utente al posto di [Cognome Nome].

Il file [name]-key.pem è la chiave privata e va tenuta da conto, mentre [name]-cert.pem è il certificato pubblico da distribuire; [name]-cert.p12 è binario, crittato e contiene la chiave privata e quindi va tenuto in posto sicuro.


Rif.: Setting up OpenSSL to Create Certificates, Creating PKCS12 Certificates,Setting up SSL Certificates on Apache.

Scritto da gky - Commenti (1)

Commenti

Grazie!!!

Scritto da cz, lunedì 10 marzo 2008

Nuovo commento

Daresti un voto a questo post, per favore?

Nota: e sono obbligatori, perché non è carino lasciare commenti vuoti o anonimi; l' invece è facoltativo, ma deve essere nel formato URL (es.: http://www.antani.com): ci vuole "http://" davanti. Per l' fate voi, tanto non viene pubblicato. L'unico tag consentito nel testo è il link, senza attributo target: <a href="URL">sito</a>. L' è fastidioso, ma necessario.