CentOS7: private PKI : Signer des certificats Server et Client

De Pegasus45

Signer des certificats Serveur et Client

Nous allons signer des certificats en utilisant l'Autorité Intermédiaire. Vous pouvez utiliser ces certificats signés dans diverses situations, comme par ex. pour sécuriser les communications avec un serveur Web ou pour authentifier des clients lors de la connexion à un service.

Remarque: Les étapes ci-dessous montrent la procédure de création d'un certificat pour un client (clé privée et certificat). Cependant, une tierce personne peut très bien créer sa propre clé privée et sa demande de signature (CSR). Elle vous fournira sa demande CSR et vous devrez la signer pour générer le certificat signé. Dans ce scénario, vous pouvez sauter les commandes "genrsa" et "req".


Création de la clé privée

Nos Autorité Racine et Intermédiaire utilisent des clés de 4096bits. Comme les certificats Server et Client expirent généralement au bout d'un an, vous pouvez, sans trop de crainte, utiliser des clés de 2048bits.

Remarque: Bien qu'une clé 4096bits est plus sécuritaire que 2048bits, elle ralentit les négociations TLS (TLS handshake) et augmente significativement la charge CPU durant les négociations de connexions. Pour ces raisons, la plupart des sites Web utilisent des clés 2048bits.

Si vous voulez créer une clé privée pour un serveur Web (par ex. Apache), vous devrez saisir un mot de passe à chaque redémarrage du serveur Web. Vous pouvez aussi omettre l'option "-aes256" pour créer une clé sans mot de passe ou bien de convertir la clé avec mot de passe en une clé sans mot de passe, une fois transférée sur le serveur Web.

Command
cd /root/ca/intermediate_ca
openssl genrsa -aes256 \
    -out private/www.pegasus45.lan.key.pem 2048
==============================================================	
Generating RSA private key, 2048 bit long modulus
.....+++
.......+++
e is 65537 (0x10001)
Enter pass phrase for intermediate/private/www.pegasus45.lan.key.pem: secret_www_pegasus45
Verifying - Enter pass phrase for intermediate/private/www.pegasus45.lan.key.pem: secret_www_pegasus45
==============================================================

chmod 400 private/www.pegasus45.lan.key.pem


Création du certificat

On utilise la clé privée pour créer la demande de signature de certificat (CSR). Les détails du CSR n'ont pas besoin de correspondre à ceux de l'Autorité Intermédiaire. Pour les certificats Server, la valeur de "Common Name" doit correspondre au fqdn du site Web (par ex. www.pegasus45.lan) alors que pour les certificats Client, il doit être un identifiant unique (par ex. une adresse mail). Notez également que le "Common Name" ne doit pas correspondre à celui de l'Autorité Racine, ni à celui de l'Autorité Intermédiaire.

Command
cd /root/ca/intermediate_ca

openssl req -config openssl.cnf \
    -key private/www.pegasus45.lan.key.pem \
    -new -sha256 -out csr/www.pegasus45.lan.csr.pem
==============================================================
Enter pass phrase for intermediate/private/www.pegasus45.lan.key.pem: secret_www_pegasus45
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name [Loiret]:
Locality Name [Orleans]:
Organization Name [Pegasus45]:
Organizational Unit Name []:Pegasus45 Web Services
Common Name []:www.pegasus45.lan
Email Address []:
==============================================================

Pour créer le certificat, on va utiliser l'Autorité Intermédiaire pour signer le CSR. Si le certificat sera utilisé pour un serveur, il faudra utiliser l'extension "server_cert". Si le certificat sera utilisé pour authentifier un utilisateur, il faudra utiliser l'extension "usr_cert". Les certificats sont généralement délivrés pour une durée d'un an, pensez à donner une validité de quelques jours supplémentaires pour plus de commodités.

Command
cd /root/ca/intermediate_ca

openssl ca -config openssl.cnf \
    -extensions server_cert -days 375 -notext -md sha256 \
    -in csr/www.pegasus45.lan.csr.pem \
    -out certs/www.pegasus45.lan.cert.pem
==============================================================
Enter pass phrase for /root/ca/intermediate_ca/private/intermediate.key.pem: secret_intermediate_ca
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4096 (0x1000)
        Validity
            Not Before: Feb 22 13:37:17 2016 GMT
            Not After : Mar  3 13:37:17 2017 GMT
        Subject:
            countryName               = FR
            stateOrProvinceName       = Loiret
            localityName              = Orleans
            organizationName          = Pegasus45
            organizationalUnitName    = Pegasus45 Web Services
            commonName                = www.pegasus45.lan
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Server
            Netscape Comment: 
                OpenSSL Generated Server Certificate
            X509v3 Subject Key Identifier: 
                9A:DF:70:B1:1B:7C:EC:37:46:03:3B:50:FE:87:0E:9C:FE:91:C2:F2
            X509v3 Authority Key Identifier: 
                keyid:BD:55:CF:B7:18:E0:DF:38:9E:6B:3D:21:0F:CA:24:93:F5:0B:F5:F6
                DirName:/C=FR/ST=Loiret/L=Orleans/O=Pegasus45/OU=Pegasus45 Certificate Authority/CN=Pegasus45 Root CA
                serial:10:00

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
Certificate is to be certified until Mar  3 13:37:17 2017 GMT (375 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
==============================================================

chmod 444 certs/www.pegasus45.lan.cert.pem

Le fichier index.txt doit maintenant contenir une ligne correspondant à ce nouveau certificat:

Command
cat index.txt
##############################################################
V       170303133717Z           1000    unknown /C=FR/ST=Loiret/L=Orleans/O=Pegasus45/OU=Pegasus45 Web Services/CN=www.pegasus45.lan
##############################################################


Vérification du certificat

Command
openssl x509 -noout -text \
    -in certs/www.pegasus45.lan.cert.pem

Le "issuer" est l'Autorité Intermédiaire. Le "subject" fait référence au certificat lui-même

Command
==============================================================
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 4096 (0x1000)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=FR, ST=Loiret, O=Pegasus45, OU=Pegasus45 Certificate Authority, CN=Pegasus45 Intermediate CA
        Validity
            Not Before: Feb 22 13:37:17 2016 GMT
            Not After : Mar  3 13:37:17 2017 GMT
        Subject: C=FR, ST=Loiret, L=Orleans, O=Pegasus45, OU=Pegasus45 Web Services, CN=www.pegasus45.lan
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
==============================================================

On y voit également les "x509v3 extensions". Quand on a créé un certificat, on a utilisé soit l'extension "server_cert", soit l'extension "usr_cert". Ces options définies dans les sections correspondantes seront visibles à l'écran:

Command
==============================================================
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Server
            Netscape Comment: 
                OpenSSL Generated Server Certificate
            X509v3 Subject Key Identifier: 
                9A:DF:70:B1:1B:7C:EC:37:46:03:3B:50:FE:87:0E:9C:FE:91:C2:F2
            X509v3 Authority Key Identifier: 
                keyid:BD:55:CF:B7:18:E0:DF:38:9E:6B:3D:21:0F:CA:24:93:F5:0B:F5:F6
                DirName:/C=FR/ST=Loiret/L=Orleans/O=Pegasus45/OU=Pegasus45 Certificate Authority/CN=Pegasus45 Root CA
                serial:10:00

            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
==============================================================

On va utiliser le fichier de la chaine de certification (ca-chain.cert.pem), créé précédemment, pour vérifier que ce nouveau certificat est bien valide dans toute la chaine de confiance.

Command
openssl verify -CAfile certs/ca-chain.cert.pem \
    certs/www.pegasus45.lan.cert.pem
==============================================================
certs/www.pegasus45.lan.cert.pem: OK
==============================================================


Déploiement du certificat

Vous pouvez maintenant déployer ce nouveau certificat sur votre serveur, ou le distribuer à un client. Lorsque vous le déployez sur un serveur (par ex. Apache), vous allez avoir besoin des fichiers suivants:

  • ca-chain.cert.pem
  • www.pegasus45.lan.key.pem
  • www.pegasus45.lan.cert.pem

Si vous avez signé un CSR d'une tierce personne, vous devez transmettre à cette personne les fichiers ca-chain.cert.pem et www.pegasus45.lan.cert.pem.

Si vous voulez enlever le mot de passe de la clé privée, pour éviter de devoir saisir le mot de passe à chaque redémarrage du serveur Apache, par ex., vous pouvez utiliser la commande suivante:

Command
openssl rsa -in www.pegasus45.lan.key.pem -out www.pegasus45.lan.nokey.pem



Liste des articles concernés: