« Installation et configuration de OpenSSL » : différence entre les versions

De Linux Server Wiki
Aller à la navigation Aller à la recherche
(16 versions intermédiaires par le même utilisateur non affichées)
Ligne 77 : Ligne 77 :
touch /etc/ssl/root_ca/index.txt
touch /etc/ssl/root_ca/index.txt
touch /etc/ssl/core_ca/index.txt
touch /etc/ssl/core_ca/index.txt
echo 01 > /etc/ssl/root_ca/serial
touch /etc/ssl/root_ca/serial
echo 01 > /etc/ssl/core_ca/serial
touch /etc/ssl/core_ca/serial
</pre>
</pre>


Ligne 87 : Ligne 87 :


<pre>
<pre>
openssl_conf = default_conf
[ ca ]
[ ca ]
#Cette section nous permet de définir l'autorité de certification par défaut.
#Cette section nous permet de définir l'autorité de certification par défaut.
Ligne 104 : Ligne 105 :
preserve        = no
preserve        = no
policy          = policy_match
policy          = policy_match
#unique_subject = no # Set to 'no' to allow creation of several certs with same subject.


#l'autorité de certification intermédiaire valable 10 ans
#l'autorité de certification intermédiaire valable 10 ans
Ligne 118 : Ligne 120 :
preserve        = no   
preserve        = no   
policy          = policy_match
policy          = policy_match
#unique_subject = no # Set to 'no' to allow creation of several certs with same subject.
</pre>
</pre>


Ligne 144 : Ligne 147 :
<pre>
<pre>
[ req ]
[ req ]
default_bits            = 2048
default_bits            = 4096
distinguished_name      = req_distinguished_name
distinguished_name      = req_distinguished_name
string_mask = utf8only


[ req_distinguished_name ]
[ req_distinguished_name ]
Ligne 173 : Ligne 177 :
challengePassword_max          = 20
challengePassword_max          = 20
unstructuredName                = An optional company name
unstructuredName                = An optional company name
</pre>
<pre>
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2
</pre>
</pre>


Ligne 197 : Ligne 213 :


==Création de l'autorité root==
==Création de l'autorité root==
===V1===
Maintenant nous pouvons créer le certificat de l'autorité de certification :
Maintenant nous pouvons créer le certificat de l'autorité de certification :
<pre>
<pre>
cd /etc/ssl/root_ca/
cd /etc/ssl/root_ca/
openssl req -x509 -config /etc/ssl/openssl.cnf -newkey rsa:4096 -sha256 -extensions ROOT_CA -days 3650 -keyout private/root_ca.key -out root_ca.pem
openssl req -x509 -config /etc/ssl/openssl.cnf -newkey rsa:8192 -sha256 -extensions ROOT_CA -days 3650 -keyout private/root_ca.key -out root_ca.pem
</pre>
</pre>


Ligne 206 : Ligne 224 :
* req permet de créer des des demandes de certificats.
* req permet de créer des des demandes de certificats.
* -x509 permet de créer un certificat auto-signé au lieu d'une simple demande de certificat.
* -x509 permet de créer un certificat auto-signé au lieu d'une simple demande de certificat.
* -newkey rsa:4096 permet de créer la clé privée en même temps ; L'algorithme de chiffrement RSA est utilisé avec une clé de 4096 bits.
* -newkey rsa:8192 permet de créer la clé privée en même temps ; L'algorithme de chiffrement RSA est utilisé avec une clé de 8192 bits.
* -extensions ROOT_CA spécifie qu'il faut utiliser la section [ROOT_CA] du fichier de configuration de openssl pour configurer le certificat.
* -extensions ROOT_CA spécifie qu'il faut utiliser la section [ROOT_CA] du fichier de configuration de openssl pour configurer le certificat.
* -days 3650 permet de définir la durée de validité du certificat. Ici, 3650 jours.
* -days 3650 permet de définir la durée de validité du certificat. Ici, 3650 jours.
Ligne 218 : Ligne 236 :
chmod -R 600 /etc/ssl/root_ca/private
chmod -R 600 /etc/ssl/root_ca/private
</pre>
</pre>
Nous allons ensuite initialiser le serial par un nombre aléatoire
<pre>openssl x509 -serial -noout -in root_ca.pem | cut -d= -f2 > serial</pre>
===V2===
<pre>openssl req -new -newkey rsa:2048 -keyout private/cakey.pem -out careq.pem -config /etc/ssl/openssl.cnf </pre>
<pre>openssl ca -create_serial -out cacert.pem -days 365 -keyfile private/cakey.pem -selfsign -config /etc/ssl/openssl.cnf -infiles careq.pem </pre>
-create_serial est important et permet d'initialiser un sérial aléatoire de 128 bits.
Passer par ces deux commandes (plutôt que tout créer directement par <code>req</code>) est nécessaire car <code>req</code> ne supporte pas -create_serial
see https://www.phildev.net/ssl/creating_ca.html


==Création de l'autorité intermédiaire==
==Création de l'autorité intermédiaire==
Ligne 224 : Ligne 257 :
<pre>
<pre>
cd /etc/ssl/core_ca
cd /etc/ssl/core_ca
openssl req -newkey rsa:4096 -sha256 -keyout private/core_ca.key -out core_ca.req
openssl req -newkey rsa:8192 -sha256 -keyout private/core_ca.key -out core_ca.req
</pre>
</pre>
Puis on signe le certificat en utilisant la ca par défaut (défini dans le fichier openssl.cnf), c'est-à-dire, la CA_ROOT.
Puis on signe le certificat en utilisant la ca par défaut (défini dans le fichier openssl.cnf), c'est-à-dire, la CA_ROOT.
Notez qu'on précise qu'il faut configurer ce nouveau certificat en utilisant la section CORE_CA du fichier de configuration.
Notez qu'on précise qu'il faut configurer ce nouveau certificat en utilisant la section CORE_CA du fichier de configuration.
<pre>
<pre>
openssl ca -extensions CORE_CA -in core_ca.req -out core_ca.pem
openssl ca -extensions CORE_CA -in core_ca.req -out core_ca.pem</pre>
 
On génère le serial de core_ca
<pre>
openssl x509 -serial -noout -in core_ca.pem | cut -d= -f2 > serial
</pre>
</pre>
Enfin, on s'assure que la clé privée de cette nouvelle autorité est elle aussi à l'abri :
Enfin, on s'assure que la clé privée de cette nouvelle autorité est elle aussi à l'abri :
Ligne 239 : Ligne 276 :
Pour générer la clé privé et la demande de certificat :
Pour générer la clé privé et la demande de certificat :
<pre>
<pre>
openssl req -newkey rsa:2048 -sha256 -keyout cle-privee.key -out cle-publique.req
openssl req -newkey rsa:4096 -sha256 -keyout cle-privee.key -out cle-publique.req
</pre>
</pre>
Puis on signe le certificat. L'option <code>-name</code> permet de préciser qu'il faut utiliser l'autorité <code<core_ca</code> pour signer notre nouveau certificat.
Puis on signe le certificat. L'option <code>-name</code> permet de préciser qu'il faut utiliser l'autorité <code<core_ca</code> pour signer notre nouveau certificat.
Ligne 260 : Ligne 297 :
subjectAltName                  = DNS:www.server.com, DNS:webmail.server.com
subjectAltName                  = DNS:www.server.com, DNS:webmail.server.com
basicConstraints                = critical,CA:FALSE
basicConstraints                = critical,CA:FALSE
keyUsage                        = digitalSignature, nonRepudiation, keyEncipherment
keyUsage                        = critical, digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
nsCertType                      = server
extendedKeyUsage                = serverAuth
extendedKeyUsage                = serverAuth
Ligne 269 : Ligne 306 :
On génère la clé privé et la demande de certificat :
On génère la clé privé et la demande de certificat :
<pre>
<pre>
openssl req -newkey rsa:2048 -sha256 -keyout cle-privee.key -out cle-publique.req
openssl req -newkey rsa:4096 -sha256 -keyout cle-privee.key -out cle-publique.req
</pre>
</pre>
Puis on signe le certificat. L'option <code>-name</code> permet de préciser qu'il faut utiliser l'autorité <code>core_ca</code> pour signer notre nouveau certificat :
Puis on signe le certificat. L'option <code>-name</code> permet de préciser qu'il faut utiliser l'autorité <code>core_ca</code> pour signer notre nouveau certificat :
Ligne 287 : Ligne 324 :
subjectAltName                  = critical,email:copy,email:root@server.com,email:admin@server.com
subjectAltName                  = critical,email:copy,email:root@server.com,email:admin@server.com
basicConstraints                = critical,CA:FALSE
basicConstraints                = critical,CA:FALSE
keyUsage                        = digitalSignature, nonRepudiation
keyUsage                        = critical,digitalSignature, nonRepudiation
nsCertType                      = client
nsCertType                      = client
extendedKeyUsage                = clientAuth
extendedKeyUsage                = clientAuth
Ligne 298 : Ligne 335 :
Identifiez le certificat dans le fichier <code>/etc/ssl/core_ca/index.txt</code>. Par exemple, pour révoquer le certificat qui a l'identifiant 03 :
Identifiez le certificat dans le fichier <code>/etc/ssl/core_ca/index.txt</code>. Par exemple, pour révoquer le certificat qui a l'identifiant 03 :
<pre>openssl ca -revoke /etc/ssl/core_ca/newcerts/03.pem</pre>
<pre>openssl ca -revoke /etc/ssl/core_ca/newcerts/03.pem</pre>
=Compatibilité avec la bibliothèque de certificats des distributions Linux=
Placez le certificat de votre CA dans /etc/ssl/certs/myca.pem puis lancez les commandes suivantes :
<pre>cd /etc/ssl/certs/
chmod o+r myca.pem
ln -s myca.pem `openssl x509 -hash -noout -in myca.pem`.0
cd
</pre>

Version du 3 octobre 2020 à 21:37

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
touch /etc/ssl/root_ca/serial
touch /etc/ssl/core_ca/serial

le fichier /etc/openssl.cnf

Ensuite nous allons configurer /etc/ssl/openssl.cnf pour qu'il reconnaisse cette arborescence. La configuration est divisée en plusieurs sections qui commencent chacune par [ nom_de_section ]. Modifiez le fichier /etc/ssl/openssl.cnf comme suit :

openssl_conf = default_conf
[ 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      = sha256
preserve        = no
policy          = policy_match
#unique_subject = no # Set to 'no' to allow creation of several certs with same subject.

#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      = sha256
preserve        = no  
policy          = policy_match
#unique_subject = no # Set to 'no' to allow creation of several certs with same subject.

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            = 4096
distinguished_name      = req_distinguished_name
string_mask = utf8only

[ 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
[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

Enfin, nous allons créer une section spécifique pour la configuration des certificats des 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

Faites attention à la directive pathlen : si vous décidez de créer plus (ou moins) d'autorités intermédiaires, il vous faudra l'adapter en conséquence. Pour plus d'informations, rendez vous ici

Création de l'autorité root

V1

Maintenant nous pouvons créer le certificat de l'autorité de certification :

cd /etc/ssl/root_ca/
openssl req -x509 -config /etc/ssl/openssl.cnf -newkey rsa:8192 -sha256 -extensions ROOT_CA -days 3650 -keyout private/root_ca.key -out root_ca.pem

Quelques explications :

  • req permet de créer des des demandes de certificats.
  • -x509 permet de créer un certificat auto-signé au lieu d'une simple demande de certificat.
  • -newkey rsa:8192 permet de créer la clé privée en même temps ; L'algorithme de chiffrement RSA est utilisé avec une clé de 8192 bits.
  • -extensions ROOT_CA spécifie qu'il faut utiliser la section [ROOT_CA] du fichier de configuration de openssl pour configurer le certificat.
  • -days 3650 permet de définir la durée de validité du certificat. Ici, 3650 jours.
  • -keyout défini le chemin où sera stocké la clé privée.
  • -out désigne le chemin où sera stocké la clé publique.

Le mot de passe (PEM pass phrase) doit être assez compliqué étant donné que ce couple de clé assure la validité de tous les certificats qui seront signés avec lui. Si la clé privé de l'AC est compromise, c'est tous les certificats signés par l'AC qui sont compromis.

Pour s'assurer de la sécurité de la clé privée :

chmod -R 600 /etc/ssl/root_ca/private

Nous allons ensuite initialiser le serial par un nombre aléatoire

openssl x509 -serial -noout -in root_ca.pem | cut -d= -f2 > serial

V2

openssl req -new -newkey rsa:2048 -keyout private/cakey.pem -out careq.pem -config /etc/ssl/openssl.cnf 
openssl ca -create_serial -out cacert.pem -days 365 -keyfile private/cakey.pem -selfsign -config /etc/ssl/openssl.cnf -infiles careq.pem 

-create_serial est important et permet d'initialiser un sérial aléatoire de 128 bits.

Passer par ces deux commandes (plutôt que tout créer directement par req) est nécessaire car req ne supporte pas -create_serial

see https://www.phildev.net/ssl/creating_ca.html

Création de l'autorité intermédiaire

L'autorité de certification root est maintenant créée. Nous allons créer l'autorité intermédiaire. On commence par créer une nouvelle clé privé ainsi qu'une demande de certificat :

cd /etc/ssl/core_ca
openssl req -newkey rsa:8192 -sha256 -keyout private/core_ca.key -out core_ca.req

Puis on signe le certificat en utilisant la ca par défaut (défini dans le fichier openssl.cnf), c'est-à-dire, la CA_ROOT. Notez qu'on précise qu'il faut configurer ce nouveau certificat en utilisant la section CORE_CA du fichier de configuration.

openssl ca -extensions CORE_CA -in core_ca.req -out core_ca.pem

On génère le serial de core_ca

openssl x509 -serial -noout -in core_ca.pem | cut -d= -f2 > serial

Enfin, on s'assure que la clé privée de cette nouvelle autorité est elle aussi à l'abri :

chmod -R 600 private/

On peut maintenant créer des certificats et les signer avec notre autorité intermédiaire. Pour générer la clé privé et la demande de certificat :

openssl req -newkey rsa:4096 -sha256 -keyout cle-privee.key -out cle-publique.req

Puis on signe le certificat. L'option -name permet de préciser qu'il faut utiliser l'autorité <code<core_ca pour signer notre nouveau certificat.

openssl ca -name core_ca -in cle-publique.req -out certificat.pem

Pour que les clients (http, mail, ftp, ...) reconnaissent comme valide les certificats que vous signez avec votre AC il faut ajouter le fichier /etc/ssl/root_ca/root_ca.pem (et /etc/ssl/core_ca/core_ca.pem si votre serveur est mal configuré) à leur liste d'autorité de certification valide. Par exemple, pour firefox, il faut aller dans l'onglet Avancé de la configuration, sélectionner l'onglet Chiffrement, cliquer sur Afficher les Certificats, sélectionner l'onglet Autorités et cliquer sur Importer pour importer son certificat.

Générer des certificats serveurs

Pour commencer, ajoutez la section suivante dans votre fichier /etc/ssl/openssl.cnf :

[SERVER_SSL]
nsComment                       = "SSL Server Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
subjectAltName                  = DNS:www.server.com, DNS:webmail.server.com
basicConstraints                = critical,CA:FALSE
keyUsage                        = critical, digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

Nous allons créer un certificat valide à la fois pour les adresses www.server.com et webmail.server.com (directive subjectAltName). Attention cependant, lors de la génération du certificat, pensez à définir le commonName à www.server.com

On génère la clé privé et la demande de certificat :

openssl req -newkey rsa:4096 -sha256 -keyout cle-privee.key -out cle-publique.req

Puis on signe le certificat. L'option -name permet de préciser qu'il faut utiliser l'autorité core_ca pour signer notre nouveau certificat :

openssl ca -name core_ca -extensions SERVER_SSL -in cle-publique.req -out certificat.pem

Générer des certificats clients

Ajoutez la section suivante dans votre fichier /etc/ssl/openssl.cnf :

[CLIENT_SSL]
nsComment                       = "SSL Client Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
subjectAltName                  = critical,email:copy,email:root@server.com,email:admin@server.com
basicConstraints                = critical,CA:FALSE
keyUsage                        = critical,digitalSignature, nonRepudiation
nsCertType                      = client
extendedKeyUsage                = clientAuth

La génération du couple de clé repose sur le même principe que pour un serveur.

Révoquer un certificat

Identifiez le certificat dans le fichier /etc/ssl/core_ca/index.txt. Par exemple, pour révoquer le certificat qui a l'identifiant 03 :

openssl ca -revoke /etc/ssl/core_ca/newcerts/03.pem

Compatibilité avec la bibliothèque de certificats des distributions Linux

Placez le certificat de votre CA dans /etc/ssl/certs/myca.pem puis lancez les commandes suivantes :

cd /etc/ssl/certs/
chmod o+r myca.pem
ln -s myca.pem `openssl x509 -hash -noout -in myca.pem`.0
cd