Skip to the content.

Public Key Infrastructure

La génération des certificats se fait en 2 étapes :

  1. Création de l'Autorité de Certification racine (Root CA), par la création d'un certificat auto-signé
  2. Création d'un certificat pour un objet par :
    1. La génération d'une clé privée, et d'une CSR (Certificate Signing Request) qui contient (identité + clé publique)
    2. La signature de la CSR par l'AC.

Création de l'Autorité de Certification

On commence par créer un fichier dn.conf qui contient :

[req]
prompt = no
distinguished_name = dn

[dn]
C  = FR
ST = France
L  = Ville
O  = Company
OU = R&D
CN = RootCA

Puis on crée l'Autorité de Certification :

mkdir {private,csr,certs}
# Création d'un certificat auto-signé
# on génÚre une clé de 4096 bits car c'est le root CA
# on met une passphrase à la clé privée (dans le prompt) car c'est le root CA et qu'il sera sollicité que pour signer des certificats
openssl req -config dn.conf -x509 -newkey rsa:4096 -keyout private/ca.key -out certs/ca.pem -set_serial 0
# on affiche le certificat
openssl x509 -in certs/ca.pem -text -noout

Comme le Subject (l'identitĂ© du propriĂ©taire) et l'Issuer (entitĂ© qui a signĂ© le certificat) sont les mĂȘmes, on sait que ce certificat est auto-signĂ©.

Création d'un certificat signé par l'AC

Pour créer un certificat, on reprend dn.conf en modifiant seulement le CN.

Si on veut ajouter des noms alternatifs au certificat (Subject Alternative Name), le fichier dn.conf doit contenir :

[req]
prompt = no
distinguished_name = dn
req_extensions = req_ext

[dn]
C  = FR
ST = France
L  = Ville
O  = Company
OU = R&D
CN = croissant.fr

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = brioche.fr
IP.1  = 192.168.1.1

Puis on crée le certificat :

# Génération d'une clé privée et d'une CSR
# on génÚre une clé de 2048 bits car les handshake TLS seront plus coûteux en temps/cpu
# on met pas de passphrase à la clé privée (avec l'option -nodes) car pas pratique
openssl req -config dn.conf -newkey rsa:2048 -nodes -keyout private/server.key -out csr/server.csr
# on affiche la CSR pour vérifier les valeurs (et le Subject Alternative Name si on l'a demandé)
openssl req -in csr/server.csr -text -noout
# Signature de la CSR par l'AC
openssl x509 -req -in csr/server.csr -CA certs/ca.pem -CAkey private/ca.key -out certs/server.pem -CAcreateserial -extfile dn.conf -extensions req_ext
# on affiche le certificat pour vérifier
openssl x509 -in certs/server.pem -text -noout

Pour plus d'infos : man req et man x509.

TODO: utiliser du chiffrement par courbe elliptique pour ne plus se soucier des perfs