« Installation et configuration de OpenSSL » : différence entre les versions
(Page créée avec « Ce howto a été écrit au départ pour debian etch puis a été adapté pour debian lenny. Il reste cependant valable la plupart du temps pour ces deux versions de debian. ... ») |
Aucun résumé des modifications |
||
Ligne 21 : | Ligne 21 : | ||
Par exemple, la commande <code>ca</code> gère les autorités de certification, la commande <code>req</code> gère les requêtes de certificat, ... | Par exemple, la commande <code>ca</code> gère les autorités de certification, la commande <code>req</code> gère les requêtes de certificat, ... | ||
Voici les principales directives utilisés pour des certificats ssl : | |||
* basicConstraints | |||
** pathlen : profondeur de la clé, c''est-à-dire, le nombre de certificats pouvant apparaître sous le certificat en question (on parle de chaine de certification). Cette directive est capitale si vous souhaitez mettre en place une chaine de certification avec plusieurs autorités de certification (AC). La dernière autorité de la chaine devrait avoir une profondeur de 0 (c'est l'autorité qui sera chargée de délivrer les certificats clients et serveurs). | |||
** CA : TRUE pour une autorité, FALSE pour un certificat serveur ou client. | |||
* keyUsage | |||
** digitalSignature (RSA/DSA) : pour la signature en tant que méthode de chiffrement | |||
** nonRepudiation (RSA/DSA) : pour la signature en tant que service | |||
** keyEncipherment (RSA) : chiffrement de clé (privé) | |||
** dataEncipherment (RSA) : chiffrement de données | |||
** keyCertSign (RSA/DSA) : signature de certificats (utilisé pour les AC) | |||
** cRLSign (RSA/DSA) : signature de listes de révocation (encore une fois utile pour les AC) | |||
** keyAgreement (DH) : pour la négociation d'une clé de session | |||
** encipherOnly et decipherOnly (DH) : à préciser en même temps que keyAgreement | |||
* nsCertType | |||
** client ou server : pour une authentification ou du chiffrement client / serveur selon le cas | |||
** email : chiffrement de mails en S/MIME | |||
** objsign : signature de code | |||
** sslCA, emailCA, objCA : pour délivrer des autorités de certifications ayant les propriétés client/serveur, email ou obj | |||
* extendedKeyUsage | |||
** serverAuth : à utiliser en même temps que un nsCertType server | |||
** clientAuth : à utiliser en même temps que un nsCertType client | |||
** codeSigning : à utiliser en même temps que un nsCertType objsign | |||
** emailProtection : à utiliser en même temps que un nsCertType email | |||
* subjectAltName : à utiliser pour utiliser le même certificat sur plusieurs sites webs différents (name-based virtual host de apache), ou encore pour des adresses mails associés au même certificat | |||
=Mise en place d'une autorité de certification= | |||
Pour commencer il faut créer une arborescence pour l'AC dans /etc/ssl/. Nous allons créer les arborescences suivante : | |||
<pre> | |||
root_ca/ | |||
|-- certs/ | |||
|-- crl/ | |||
|-- newcerts/ | |||
|-- private/ | |||
|-- serial | |||
|-- index.txt | |||
</pre> | |||
et | |||
<pre> | |||
core_ca/ | |||
|-- certs/ | |||
|-- crl/ | |||
|-- newcerts/ | |||
|-- private/ | |||
|-- serial | |||
|-- index.txt | |||
</pre> | |||
Exécutez les commandes suivantes : | |||
<pre> | |||
mkdir -p /etc/ssl/root_ca/{certs,crl,newcerts,private} | |||
mkdir -p /etc/ssl/core_ca/{certs,crl,newcerts,private} | |||
touch /etc/ssl/root_ca/index.txt | |||
touch /etc/ssl/core_ca/index.txt | |||
echo 01 > /etc/ssl/root_ca/serial | |||
echo 01 > /etc/ssl/core_ca/serial | |||
</pre> | |||
Ensuite nous allons configurer <code>/etc/ssl/openssl.cnf</code> pour qu'il reconnaisse cette arborescence. | |||
La configuration est divisée en plusieurs section qui commencent chacune par <code>[ nom_de_section ]</code>. | |||
Modifiez le fichier <code>/etc/ssl/openssl.cnf</code> comme suit : | |||
<pre> | |||
[ ca ] | |||
#Cette section nous permet de définir l'autorité de certification par défaut. | |||
default_ca = root_ca | |||
#l'autorité de certification racine (root) valable 10 ans | |||
[ root_ca ] | |||
dir = /etc/ssl/root_ca | |||
certs = $dir/certs | |||
new_certs_dir = $dir/newcerts | |||
database = $dir/index.txt | |||
certificate = $dir/root_ca.pem | |||
serial = $dir/serial | |||
private_key = $dir/private/root_ca.key | |||
default_days = 3650 | |||
default_md = sha1 | |||
preserve = no | |||
policy = policy_match | |||
#l'autorité de certification intermédiaire valable 10 ans | |||
[ core_ca ] | |||
dir = /etc/ssl/core_ca | |||
certs = $dir/certs | |||
new_certs_dir = $dir/newcerts | |||
database = $dir/index.txt | |||
certificate = $dir/core_ca.pem | |||
serial = $dir/serial | |||
private_key = $dir/private/core_ca.key | |||
default_days = 3650 | |||
default_md = sha1 | |||
preserve = no | |||
policy = policy_match | |||
</pre> | |||
Vous pouvez laisser les sections [ policy_match ] et [ policy_anything ] telle quelle : | |||
<pre> | |||
[ policy_match ] | |||
countryName = match | |||
stateOrProvinceName = match | |||
localityName = match | |||
organizationName = match | |||
organizationalUnitName = optional | |||
commonName = supplied | |||
emailAddress = optional | |||
[ policy_anything ] | |||
countryName = optional | |||
stateOrProvinceName = optional | |||
localityName = optional | |||
organizationName = optional | |||
organizationalUnitName = optional | |||
commonName = supplied | |||
emailAddress = optional | |||
</pre> | |||
Les sections [ req ] et [ req_distinguished_name ] définissent les paramètres par défaut pour la création d'un certificat ssl : | |||
<pre> | |||
[ req ] | |||
default_bits = 2048 | |||
distinguished_name = req_distinguished_name | |||
[ req_distinguished_name ] | |||
countryName = Country Name (2 letter code) | |||
countryName_default = FR | |||
countryName_min = 2 | |||
countryName_max = 2 | |||
stateOrProvinceName = State or Province Name (full name) | |||
stateOrProvinceName_default = Alsace | |||
localityName = Locality Name (eg, city) | |||
localityName_default = Strasbourg | |||
0.organizationName = Organization Name (eg, company) | |||
0.organizationName_default = CSNU | |||
# we can do this but it is not needed normally :-) | |||
#1.organizationName = Second Organization Name (eg, company) | |||
#1.organizationName_default = World Wide Web Pty Ltd | |||
organizationalUnitName = Organizational Unit Name (eg, section) | |||
#organizationalUnitName_default = | |||
commonName = Common Name (eg, YOUR name) | |||
commonName_max = 64 | |||
emailAddress = Email Address | |||
emailAddress_max = 64 | |||
[ req_attributes ] | |||
challengePassword = A challenge password | |||
challengePassword_min = 4 | |||
challengePassword_max = 20 | |||
unstructuredName = An optional company name | |||
</pre> | |||
Enfin, nous allons créer une section spécifique aux autorités de certification que nous allons mettre en place : | |||
<pre> | |||
[ROOT_CA] | |||
nsComment = "ROOT CA" | |||
subjectKeyIdentifier = hash | |||
authorityKeyIdentifier = keyid,issuer:always | |||
basicConstraints = critical,CA:TRUE,pathlen:1 | |||
keyUsage = keyCertSign, cRLSign | |||
[CORE_CA] | |||
nsComment = "SSL CA" | |||
basicConstraints = critical,CA:TRUE,pathlen:0 | |||
subjectKeyIdentifier = hash | |||
authorityKeyIdentifier = keyid,issuer:always | |||
issuerAltName = issuer:copy | |||
keyUsage = keyCertSign, cRLSign | |||
nsCertType = sslCA | |||
</pre> |
Version du 1 février 2011 à 19:49
Ce howto a été écrit au départ pour debian etch puis a été adapté pour debian lenny. Il reste cependant valable la plupart du temps pour ces deux versions de debian.
Protéger les données qui transitent au travers des différents protocoles peut parfois être primordial. Le chiffrement le plus utilisé actuellement est SSL. Le principe de SSL est basé sur l'utilisation de deux clés : une clé publique qui sert à déchiffrer et une clé privée qui sert à chiffrer (on parle de chiffrement asymétrique). La clé privée doit rester confidentielle alors que la clé publique peut-être transmise sans problème à tous le monde. La validité des clés publiques est assurée par une autorité de certification.
OpenSSL est une implémentation libre du protocole ssl et permet de créer facilement des couples de clés publique / privée.
Nous allons voir comment créer un autorité de certification racine (root), une autorité intermédiaire, et enfin, un couple de clé pouvant être utilisé par exemple pour apache.
Les changements de permissions effectués dans ce howto supposent que vous êtes en umask 0027
Installation et généralités
Pour installer openssl utilisez aptitude :
aptitude install openssl
Attention : certains paquets peuvent avoir besoin d'accéder au fichier /etc/ssl/openssl.cnf
(c'est par exemple le cas de bind9 depuis une mise à jour de sécurité). Veillez donc à ce que ce fichier reste accessible en lecture pour other.
Le programme openssl fonctionne de la manière suivante :
openssl <comande> [options]
Par exemple, la commande ca
gère les autorités de certification, la commande req
gère les requêtes de certificat, ...
Voici les principales directives utilisés pour des certificats ssl :
- basicConstraints
- pathlen : profondeur de la clé, cest-à-dire, le nombre de certificats pouvant apparaître sous le certificat en question (on parle de chaine de certification). Cette directive est capitale si vous souhaitez mettre en place une chaine de certification avec plusieurs autorités de certification (AC). La dernière autorité de la chaine devrait avoir une profondeur de 0 (c'est l'autorité qui sera chargée de délivrer les certificats clients et serveurs).
- CA : TRUE pour une autorité, FALSE pour un certificat serveur ou client.
- keyUsage
- digitalSignature (RSA/DSA) : pour la signature en tant que méthode de chiffrement
- nonRepudiation (RSA/DSA) : pour la signature en tant que service
- keyEncipherment (RSA) : chiffrement de clé (privé)
- dataEncipherment (RSA) : chiffrement de données
- keyCertSign (RSA/DSA) : signature de certificats (utilisé pour les AC)
- cRLSign (RSA/DSA) : signature de listes de révocation (encore une fois utile pour les AC)
- keyAgreement (DH) : pour la négociation d'une clé de session
- encipherOnly et decipherOnly (DH) : à préciser en même temps que keyAgreement
- nsCertType
- client ou server : pour une authentification ou du chiffrement client / serveur selon le cas
- email : chiffrement de mails en S/MIME
- objsign : signature de code
- sslCA, emailCA, objCA : pour délivrer des autorités de certifications ayant les propriétés client/serveur, email ou obj
- extendedKeyUsage
- serverAuth : à utiliser en même temps que un nsCertType server
- clientAuth : à utiliser en même temps que un nsCertType client
- codeSigning : à utiliser en même temps que un nsCertType objsign
- emailProtection : à utiliser en même temps que un nsCertType email
- subjectAltName : à utiliser pour utiliser le même certificat sur plusieurs sites webs différents (name-based virtual host de apache), ou encore pour des adresses mails associés au même certificat
Mise en place d'une autorité de certification
Pour commencer il faut créer une arborescence pour l'AC dans /etc/ssl/. Nous allons créer les arborescences suivante :
root_ca/ |-- certs/ |-- crl/ |-- newcerts/ |-- private/ |-- serial |-- index.txt
et
core_ca/ |-- certs/ |-- crl/ |-- newcerts/ |-- private/ |-- serial |-- index.txt
Exécutez les commandes suivantes :
mkdir -p /etc/ssl/root_ca/{certs,crl,newcerts,private} mkdir -p /etc/ssl/core_ca/{certs,crl,newcerts,private} touch /etc/ssl/root_ca/index.txt touch /etc/ssl/core_ca/index.txt echo 01 > /etc/ssl/root_ca/serial echo 01 > /etc/ssl/core_ca/serial
Ensuite nous allons configurer /etc/ssl/openssl.cnf
pour qu'il reconnaisse cette arborescence.
La configuration est divisée en plusieurs section qui commencent chacune par [ nom_de_section ]
.
Modifiez le fichier /etc/ssl/openssl.cnf
comme suit :
[ ca ] #Cette section nous permet de définir l'autorité de certification par défaut. default_ca = root_ca #l'autorité de certification racine (root) valable 10 ans [ root_ca ] dir = /etc/ssl/root_ca certs = $dir/certs new_certs_dir = $dir/newcerts database = $dir/index.txt certificate = $dir/root_ca.pem serial = $dir/serial private_key = $dir/private/root_ca.key default_days = 3650 default_md = sha1 preserve = no policy = policy_match #l'autorité de certification intermédiaire valable 10 ans [ core_ca ] dir = /etc/ssl/core_ca certs = $dir/certs new_certs_dir = $dir/newcerts database = $dir/index.txt certificate = $dir/core_ca.pem serial = $dir/serial private_key = $dir/private/core_ca.key default_days = 3650 default_md = sha1 preserve = no policy = policy_match
Vous pouvez laisser les sections [ policy_match ] et [ policy_anything ] telle quelle :
[ policy_match ] countryName = match stateOrProvinceName = match localityName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional
Les sections [ req ] et [ req_distinguished_name ] définissent les paramètres par défaut pour la création d'un certificat ssl :
[ req ] default_bits = 2048 distinguished_name = req_distinguished_name [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = FR countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Alsace localityName = Locality Name (eg, city) localityName_default = Strasbourg 0.organizationName = Organization Name (eg, company) 0.organizationName_default = CSNU # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name
Enfin, nous allons créer une section spécifique aux autorités de certification que nous allons mettre en place :
[ROOT_CA] nsComment = "ROOT CA" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always basicConstraints = critical,CA:TRUE,pathlen:1 keyUsage = keyCertSign, cRLSign [CORE_CA] nsComment = "SSL CA" basicConstraints = critical,CA:TRUE,pathlen:0 subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always issuerAltName = issuer:copy keyUsage = keyCertSign, cRLSign nsCertType = sslCA