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)

