Objectif
Créer une IGC (Infrastructure de Gestion de Cles) ou PKI (Public Key Infrastructure) en anglais doté de sa propre Autorité de Certification (CA).
Créer des certificats (auto-signés) pour des sites web en mod_ssl, pour postfix…
J’inclue aussi dans ce tutoriel le moyen de créer différents certificats SSL pour des VirtualHosts différents.
Architecture de l’IGC
/server/openssl/
|
+---ca/ (contenant les fichiers de l'autorité de certification)
| |
| +---newcerts/ (contenant la base de données des certificats signées par cette CA)
|
+---conf/ (contenant les fichiers de configuration xxx.openssl.cnf)
|
+---cert/ (contenant les certificats signés)
|
+---csr/ (contenant les demandes de signature)
|
+---key/ (contenant les clefs SECRETES)
Création de l’Autorité de Certification (CA)
Création des répertoires et database
On suppose que l’IGC sera à l’emplacement /server/openssl/
on créé donc un répertoire ca/ contenant tout ce dont l’autorité de certification aura besoin.
# cd /server/openssl
Créer le répertoire ca et la database
# mkdir -p ./ca/newcerts && touch ./ca/index.txt && echo '01'> ./ca/serial
# chmod 700 ./ca
Création du fichier de Configuration de la CA
Le fichier sera appelé conf/ca.openssl.cnf
Voici le contenu de ce fichier:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /server/openssl
certs = $dir/ca/certs
new_certs_dir = $dir/ca/newcerts
database = $dir/ca/index.txt
certificate = $dir/ca/ca.pem
serial = $dir/ca/serial
private_key = $dir/ca/ca.key
default_days = 3650
default_md = sha1
preserve = no
policy = policy_match
[ policy_match ]
organizationName = match
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
organizationName = Organisation
organizationName_default = Nom de l'Organisation
commonName = Nom ou URL
commonName_max = 64
emailAddress = Adresse Email
emailAddress_max = 40
[CA]
nsComment = "Commentaire pour Netscape"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = keyCertSign, cRLSign
Créer le Certificat de l’autorité de Certification
La commande suivant va créer une autorité de certification valable pour 10 ans (-days 3650)
# openssl req -new -x509 -config ./conf/ca.openssl.cnf -extensions CA -sha1 -newkey rsa:4096 -nodes -days 3650 -keyout ca/ca.key -out ca/ca.pem
Comment créer les Certificats SSL
Créer un Certificat pour Apache2 mod_ssl
Après avoir créé la CA, il faut maintenant générer un certificat pour Apache2.
Dans cet exemple, nous allons gérer différents VirtualHost, à savoir foo.kns7.org et bar.kns7.org
Création du fichier de Configuration
Le fichier sera appelé conf/apache.openssl.cnf
Voici le contenu de ce fichier:
Bien penser à modifier les entrées sous ALIASES selon les noms DNS des hôtes virtuels.
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /server/openssl
certs = $dir/ca/certs
new_certs_dir = $dir/ca/newcerts
database = $dir/ca/index.txt
certificate = $dir/ca/ca.pem
serial = $dir/ca/serial
private_key = $dir/ca/ca.key
default_days = 3650
default_md = sha1
preserve = no
policy = policy_match
[ policy_match ]
organizationName = match
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
organizationName = Organisation
organizationName_default = Nom de l'Organisation
commonName = Nom ou URL
commonName_max = 64
emailAddress = Adresse Email
emailAddress_max = 40
[CA]
nsComment = "Commentaire pour Netscape"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = keyCertSign, cRLSign
[SERVEUR]
nsComment = "Certificat"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
issuerAltName = issuer:copy
basicConstraints = critical,CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
nsCertType = server
extendedKeyUsage = serverAuth
subjectAltName = @ALIASES
[ALIASES]
DNS.1 = foo.kns7.org
DNS.2 = bar.kns7.org
Création du Certificat pour Apache2
# openssl req -new -config ./conf/apache.openssl.cnf -newkey rsa:4096 -nodes -keyout key/apache.key -out csr/apache.csr
Signer le Certificat par l’Autorité de Certification
Il faut ensuite signer ce nouveau certificat à l’aide de l’autorité de certification créée plus haut.
# openssl ca -config ./conf/apache.openssl.cnf -extensions SERVEUR -in csr/apache.csr -out cert/apache.pem
Modifier la Configuration d’Apache2
Editer le(s) fichier(s) de configuration contenant les définitions des VirtualHost foo.kns7.org et bar.kns7.org pour déclarer le certificat ssl et la clef.
Pour cela modifier les directives SSLCertificateFile et SSLCertificateKeyFile comme le montre l’exemple suivant:
<VirtualHost foo.kns7.org:443>
ServerAdmin webmaster.kns7.org
ServerName foo.kns7.org
DocumentRoot /chemin/repertoire/www/foo/
<Directory /chemin/repertoire/www/foo />
...
</Directory>
SSLEngine On
SSLCertificateFile /server/openssl/apache.pem
SSLCertificateKeyFile /server/openssl/apache.key
ErrorLog /var/log/apache2/foo/error.log
# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/foo/access.log combined
</VirtualHost>
<VirtualHost bar.kns7.org:443>
ServerAdmin webmaster.kns7.org
ServerName bar.kns7.org
DocumentRoot /chemin/repertoire/www/bar/
<Directory /chemin/repertoire/www/bar />
...
</Directory>
SSLEngine On
SSLCertificateFile /server/openssl/apache.pem
SSLCertificateKeyFile /server/openssl/apache.key
ErrorLog /var/log/apache2/bar/error.log
# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/bar/access.log combined
</VirtualHost>
Redémarrage du service Apache2
Il ne reste plus qu’à relancer apache2 par la commande suivante :
# /etc/init.d/apache2 reload
Et vérifier ensuite dans le log de error.log d’apache2 qu’il n’y ai pas d’erreurs.
Créer un certificat pour Postfix TLS
Création du fichier de Configuration
Le fichier sera appelé conf/smtp.openssl.cnf
Voici le contenu de ce fichier:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /server/openssl
certs = $dir/ca/certs
new_certs_dir = $dir/ca/newcerts
database = $dir/ca/index.txt
certificate = $dir/ca/ca.pem
serial = $dir/ca/serial
private_key = $dir/ca/ca.key
default_days = 3650
default_md = sha1
preserve = no
policy = policy_match
[ policy_match ]
organizationName = match
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
organizationName = Organisation
organizationName_default = Nom de l'Organisation
commonName = Nom ou URL
commonName_max = 64
emailAddress = Adresse Email
emailAddress_max = 40
[CA]
nsComment = "Commentaire pour Netscape"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = keyCertSign, cRLSign
[SERVEUR]
nsComment = "Certificat"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
issuerAltName = issuer:copy
basicConstraints = critical,CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
nsCertType = server
extendedKeyUsage = serverAuth
Création du Certificat pour Postfix TLS
# openssl req -new -config ./conf/smtp.openssl.cnf -newkey rsa:4096 -nodes -keyout key/smtp.key -out csr/smtp.csr
Signer le Certificat par l’Autorité de Certification
Il faut ensuite signer ce nouveau certificat à l’aide de l’autorité de certification créée plus haut.
# openssl ca -config ./conf/smtp.openssl.cnf -extensions SERVEUR -in csr/smtp.csr -out cert/smtp.pem
Modifier la Configuration de Postfix
Il suffit ensuite de modifier le fichier de configuration de Postfix /etc/postfix/main.cf pour activer le mode TLS
smtpd_use_tls = yes
smtpd_tls_cert_file = /server/openssl/cert/smtp.pem
smtpd_tls_key_file = /server/openssl/key/smtp.key
Vérifier et relancer Postfix
Une fois la modification effectuée, il est d’abord préférable de lancer la commande de vérification de postfix :
# /etc/init.d/postfix check
Si aucune erreur n’apparait, il ne reste qu’à relancer le service Postfix
# /etc/init.d/postfix restart
Créer un certificat pour Courier (IMAP ou POP3) SSL
Création du fichier de Configuration
Le fichier sera appelé conf/courier.openssl.cnf
Voici le contenu de ce fichier:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /server/openssl
certs = $dir/ca/certs
new_certs_dir = $dir/ca/newcerts
database = $dir/ca/index.txt
certificate = $dir/ca/ca.pem
serial = $dir/ca/serial
private_key = $dir/ca/ca.key
default_days = 3650
default_md = sha1
preserve = no
policy = policy_match
[ policy_match ]
organizationName = match
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
organizationName = Organisation
organizationName_default = Nom de l'Organisation
commonName = Nom ou URL
commonName_max = 64
emailAddress = Adresse Email
emailAddress_max = 40
[CA]
nsComment = "Commentaire pour Netscape"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = keyCertSign, cRLSign
[SERVEUR]
nsComment = "Certificat"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
issuerAltName = issuer:copy
basicConstraints = critical,CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
nsCertType = server
extendedKeyUsage = serverAuth
subjectAltName = @ALIASES
[ALIASES]
DNS.1 = pop.kns7.org
DNS.2 = imap.kns7.org
L’avantage des autres DNS déclarés va permettre de ne générer qu’un certificat pour les accès POP3 et IMAP SSL (ayant les noms de domaine pop.kns7.org et imap.kns7.org)
Création du Certificat pour Courier SSL
# openssl req -new -config ./conf/courier.openssl.cnf -newkey rsa:4096 -nodes -keyout key/courier.key -out csr/courier.csr
Signer le Certificat par l’Autorité de Certification
Il faut ensuite signer ce nouveau certificat à l’aide de l’autorité de certification créée plus haut.
# openssl ca -config ./conf/courier.openssl.cnf -extensions SERVEUR -in csr/courier.csr -out cert/courier.pem
Particularité de Courier
Courier a une particularité, celle de n’utiliser qu’un fichier dans lequel sont concaténés la clef et le certificat. Il faut donc le créer en lançant la commande suivante:
# cat ./key/courier.key ./cert/courier.pem > ./cert/courier_concat.pem
Modifier la Configuration de Courier
Il suffit ensuite de modifier les fichiers de configuration de Courier /etc/courier/imapd-ssl et /etc/courier/pop3d-ssl pour prendre en compte le nouveau certificat.
TLS_CERTFILE=/server/openssl/cert/courier_concat.pem
Vérifier et relancer Courier
Une fois la modification effectuée, il ne reste qu’à relancer les services courier-imap-ssl et courier-pop3-ssl
# /etc/init.d/courier-imap-ssl restart
# /etc/init.d/courier-pop3-ssl restart
Créer un certificat pour Dovecot (IMAP ou POP3) SSL
Création du fichier de Configuration
Le fichier sera appelé conf/dovecot.openssl.cnf
Voici le contenu de ce fichier:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /server/openssl
certs = $dir/ca/certs
new_certs_dir = $dir/ca/newcerts
database = $dir/ca/index.txt
certificate = $dir/ca/ca.pem
serial = $dir/ca/serial
private_key = $dir/ca/ca.key
default_days = 3650
default_md = sha1
preserve = no
policy = policy_match
[ policy_match ]
organizationName = match
commonName = supplied
emailAddress = optional
[ req ]
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
organizationName = Organisation
organizationName_default = Nom de l'Organisation
commonName = Nom ou URL
commonName_max = 64
emailAddress = Adresse Email
emailAddress_max = 40
[CA]
nsComment = "Commentaire pour Netscape"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = keyCertSign, cRLSign
[SERVEUR]
nsComment = "Certificat"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
issuerAltName = issuer:copy
basicConstraints = critical,CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
nsCertType = server
extendedKeyUsage = serverAuth
subjectAltName = @ALIASES
[ALIASES]
DNS.1 = pop.kns7.org
DNS.2 = imap.kns7.org
L’avantage des autres DNS déclarés va permettre de ne générer qu’un certificat pour les accès POP3 et IMAP SSL (ayant les noms de domaine pop.kns7.org et imap.kns7.org)
Création du Certificat pour Dovecot SSL
# openssl req -new -config ./conf/dovecot.openssl.cnf -newkey rsa:4096 -nodes -keyout key/dovecot.key -out csr/dovecot.csr
Signer le Certificat par l’Autorité de Certification
Il faut ensuite signer ce nouveau certificat à l’aide de l’autorité de certification créée plus haut.
# openssl ca -config ./conf/dovecot.openssl.cnf -extensions SERVEUR -in csr/dovecot.csr -out cert/dovecot.pem
Modifier la Configuration de Dovecot
Il suffit ensuite de modifier le fichier de configuration de Dovecot /etc/dovecot/dovecot.conf pour prendre en compte le nouveau certificat.
ssl_cert_file = /server/openssl/cert/dovecot.pem
ssl_key_file = /server/openssl/key/dovecot.key
Vérifier et relancer Dovecot
Une fois la modification effectuée, il ne reste qu’à relancer le service dovecot
# /etc/init.d/dovecot restart
Révoquer un Certificat
Afin de révoquer un certificat, il faut en premier lieu lire le fichier ca/index.txt pour trouver le numéro de série du certificat.
# cat /server/openssl/ca/index.txt
R XXXXXXXXXXXXZ 070725091233Z 01 unknown /O=foo/CN=www.foo.org/[email protected]
V XXXXXXXXXXXXZ 02 unknown /O=foo/CN=smtp.foo.org/[email protected]
Dans l’exemple ci-dessus, on a 2 certificats. Le premier est révoqué (R) et le second valide (V). Si l’on veut également révoquer le second (avec le numéro de série 02), il faudra alors taper cette commande :
# openssl ca -revoke ca/newcerts/02.pem
Exporter le certificat serveur
Les dernières versions de navigateurs, tels que Firefox3, Chrome, Internet Explorer 7 montrent systématiquement un message d’alerte concernant votre certificat autosigné. Il n’est effectivement pas reconnu comme certificat signé par une autorité de certification officielle (Verisign et cie).
Pour pallier à ce message d’alerte permanent, il vous faut importer le certificat de votre CA.
Il vous suffit pour cela de distribuer la clef publique de votre authorité de certification se trouvant (selon l’exemple) :
Il vous faudra cependant renommer ce fichier en .crt afin d’être accepté par Internet Explorer ou Google Chrome (ne supportant que du format p12 ou crt)