08
Jan 08
Rédigé par Nicolas

 Table des Matières

 

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/emailAddress=webmaster@foo.org
V XXXXXXXXXXXXZ 02 unknown /O=foo/CN=smtp.foo.org/emailAddress=postmaster@foo.org

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) :

# /server/openssl/ca/ca.pem

 

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)

© 2003 - 2018 kns7.org | Site réalisé et hébergé par KNet Solutions | Plan du site | Contact