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)

Liste des Commentaires
le 26 May 2008 à 15:41:53
Une information a été publiée aujourd'hui sur le site de Clubic de la plus haute importance concernant une faille de sécurité majeure de la librairie OpenSSL Debian (donc impactant également les systèmes Ubuntu).
Je vous recommande la plus grande attention à ce sujet!



Voici un extrait:


Le monde du logiciel libre est en émoi depuis la découverte d'une faille de sécurité majeure qui affecte plusieurs logiciels ou couches logicielles d'importance. La faille en question se situe dans la bibliothèque OpenSSL de Debian au niveau de la génération des clés utilisées pour le cryptage ou le décryptage, une fonction largement utilisée par le protocole SSH, le serveur Web Apache ou encore par les logiciels sécurisés de messagerie et le protocole VPN notamment. Deux lignes de code erronées sont à l'origine de cette faille, une faille qui affecte quatre systèmes d'exploitation et 25 logiciels au bas mot sans parler des ordinateurs affectés...

Lire la news complète sur Clubic.com
le 13 Jan 2009 à 12:19:00
Très bon tuto, avec des options qu’on ne trouve pas partout.

1) Pour ne pas recopier les informations communes, je suis favorable à une configuration unique avec des sections [CA], [SERVEUR_WEB], [SERVEUR_MAIL], [SERVEUR_…] respectivement sélectionnées avec l’argument "-extensions".

2) De manière générale, les "\" dans les lignes de commandes sont en trop. Ils n’aident pas à la compréhension et gênent le copier/coller. Autrement dit : ça serait mieux sans.
Exemple : " # openssl req -new -config ./conf/apache.openssl.cnf -newkey\ rsa:1024 -nodes -keyout key/apache.key -out csr/apache.csr"

3) J’ai suivit le tuto pour créer un certificat pour un serveur HTTP. J’ai correctement installé l’autorité racine. Mais je rencontre une erreur "sec_error_unknown_issuer" quand je consule le site sous Firefox, une idée ?

le 14 Jan 2009 à 09:57:18
Le "sec_error_unknown_issuer" venait d'un problème client.

Si tu trouve comment faire des certificats "EV", je suis preneur.
le 06 Feb 2009 à 19:07:34
Tout d'abord, merci, c'est effectivement le but de ce tuto, de regrouper différentes informations que j'ai mis un peu de temps à trouver :)

Pour les "\" Je vais m'en occuper de suite! (C'était un reste de la première version de mon tuto, dans lequel j'avais des retours à la ligne au milieu des commandes).

En ce qui concerne les certificats "EV", je n'ai malheureusement pas les moyens de m'en payer, et mon entreprise (KNet Solutions, un peu de pub) est pour le moment trop récente pour permettre d'y avoir droit. (Il faut au minimum 3 ans d'existence). Les règles pour l'acquisition de ces certificats sont draconiènes.
le 28 Apr 2009 à 16:57:07
Salut,

Pour Firefox, il n'est pas nécessaire de faire l'export en pkcs12. Il suffit d'importer dans firefox le ca.pem dans ton exemple.

De plus, dans ton exemple, tu inclus la clé privé de la CA dans le .pkcs12 chose qui n'est pas recommandée pour des raisons évidentes de sécurité.
le 29 Apr 2009 à 14:54:14
Très juste capcorne. Je vais corriger cela au plus vite.
Merci en tout cas de l'information.
gregory
le 06 May 2009 à 15:28:38
Bonjour

Je voudrai savoir si quelqu'un sais quelle est l'option dans openssl.cnf qu'il faut metter pour que le certificat de mon autorité de certification ne soit pas exportable deouis un client quelconque (xp pour moi, je suis en train de mettre en place une infrastructure wifi sécurisé avec freeradius et Active directory)

Merci d'avance
le 25 May 2009 à 09:44:57
Salut gregory,
Je n'ai pas trouvé cette option. Mais il te suffit simplement de ne pas donner accès au certificat de ta CA à tes clients.
Ceci dit, si tu trouves cette option, je serais intéressé de la connaître (afin de compléter ce tutoriel).
ralf
le 01 Apr 2010 à 16:35:32
et bien pour une fois que c'est clair et net !
bravo mec et merci

zorgull@hotmail.fr
web master de nykytech.com (reverse-enginneering)
Laissez votre commentaire:
Un ou plusieurs champs ci-dessous ne sont pas remplis correctement.
Les champs obligatoires sont indiqués par une étoile rouge









En aucun cas, votre adresse email ne sera diffusée.
Elle ne sera utilisé que pour l'avatar (service de gravatar.com)
Les champs marqués d'une sont obligatoires.





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

En Deuil contre HADOPI:
kns7.org est en deuil contre les obscurantistes industriels du divertissement et leurs lois liberticides