Capitolo 7. Certification Authority

Per gestire le connessioni SSL di tutti gli utenti su tutti i server, abbiamo ritenuto opportuna la creazione di una propria Certification Authority, che possa firmare tutti i certificati SSL utilizzati dai vari server, facendo sì che essi possano riconoscersi tra di loro e dagli utenti.

Siccome è stato necessario implementare delle cose non banali (come ad esempio la possibilità di avere certificati validi per più nomi differenti di uno stesso server), abbiamo aggiunto questo capitolo con un breve how-to che altri potrebbero trovare utile.

7.1. Configurazione iniziale

Come directory dove mantenere e gestire i certificati utilizzeremo /opt/ca:

	$ export CADIR=/opt/ca
	$ mkdir -p $CADIR
      
creiamo la struttura delle directory ed alcuni file necessari alla CA:
	$ mkdir $CADIR/certs
	$ mkdir $CADIR/conf
	$ mkdir $CADIR/crls
	$ mkdir $CADIR/ext
	$ mkdir $CADIR/newcerts
	$ mkdir $CADIR/private
	$ chmod g-rwx,o-rwx private
	$ echo '01' > serial
	$ > index
      
serial conterrà il prossimo seriale da utilizzare, mentre index è un database contenente i riferimenti ai certificati firmati dalla CA.

Ora creiamo una configurazione per la nostra CA. Quella utilizzata di default da OpenSSL nella distribuzione Debian sarge è /etc/ssl/openssl.cnf.

Per la nostra CA utilizzeremo il file di configurazione /opt/ca/conf/ca.conf. Per farlo utilizzare correttamente ad openssl, senza specificarlo nella linea di comando, basterà esportare il percorso nella variabile OPENSSL_CONF.

	$ export OPENSSL_CONF=$CADIR/conf/aica.conf
      

Il contenuto di ca.conf:

RANDFILE                = $ENV::CADIR/.random

[ ca ]
default_ca              = CA_default

[ CA_default ]
dir                     = $ENV::CADIR
certs                   = $dir/certs
crl_dir                 = $dir/crl
database                = $dir/index
new_certs_dir           = $dir/newcerts
certificate             = $dir/ca.pem
serial                  = $dir/serial
crl                     = $dir/crl.pem
private_key             = $dir/private/ca.key
x509_extensions         = certificate_extensions
email_in_dn             = no
default_days            = 3643
default_crl_days        = 31
default_md              = sha1
preserve                = yes
policy                  = policy_match

[ policy_match ]
countryName             = supplied
organizationName        = supplied
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = supplied

[ policy_anything ]
countryName             = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
default_bits            = 4096
default_md              = sha1
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions         = v3_ca
string_mask = nombstr

[ req_distinguished_name ]
countryName                     = Country Name
countryName_default             = IT
countryName_min                 = 2
countryName_max                 = 2
0.organizationName              = Organization Name
0.organizationName_default      = Intra.Org
organizationalUnitName          = Organizational Unit Name
organizationalUnitName_default  =
commonName                      = Common Name
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 60
emailAddress_default            = ca@infra.org
SET-ex3                         = SET extension number 3

[ req_attributes ]

[ certificate_extensions ]

[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = critical, CA:true
keyUsage = cRLSign, keyCertSign
nsCertType = sslCA, emailCA, objCA
nsComment = "InfraCA"
subjectAltName=email:copy
issuerAltName=issuer:copy