Le fait de conserver la même clé privée sur votre autorité de certification racine permet à tous les certificats de continuer à être validés avec succès par rapport à la nouvelle racine ; il vous suffit de faire confiance à la nouvelle racine.
La relation de signature du certificat est basée sur une signature de la clé privée ; conserver la même clé privée (et, implicitement, la même clé publique) tout en générant un nouveau certificat public, avec une nouvelle période de validité et tout autre nouvel attribut modifié si nécessaire, maintient la relation de confiance en place. Les LCR peuvent également être transférées de l'ancien certificat au nouveau, car elles sont, comme les certificats, signées par la clé privée.
Alors, vérifions !
Créez une autorité de certification racine :
openssl req -new -x509 -keyout root.key -out origroot.pem -days 3650 -nodes
Générez un certificat enfant à partir de celui-ci :
openssl genrsa -out cert.key 1024
openssl req -new -key cert.key -out cert.csr
Signer le certificat de l'enfant :
openssl x509 -req -in cert.csr -CA origroot.pem -CAkey root.key -create_serial -out cert.pem
rm cert.csr
Tout est en place, relation normale entre les certificats. Vérifions la confiance :
# openssl verify -CAfile origroot.pem -verbose cert.pem
cert.pem: OK
Ok, alors, maintenant disons que 10 ans ont passé. Générons un nouveau certificat public à partir de la même clé privée racine.
openssl req -new -key root.key -out newcsr.csr
openssl x509 -req -days 3650 -in newcsr.csr -signkey root.key -out newroot.pem
rm newcsr.csr
Et ça a marché ?
# openssl verify -CAfile newroot.pem -verbose cert.pem
cert.pem: OK
Mais pourquoi ? Ce sont des fichiers différents, non ?
# sha1sum newroot.pem
62577e00309e5eacf210d0538cd79c3cdc834020 newroot.pem
# sha1sum origroot.pem
c1d65a6cdfa6fc0e0a800be5edd3ab3b603e1899 origroot.pem
Oui, mais cela ne signifie pas que la nouvelle clé publique ne correspond pas cryptographiquement à la signature du certificat. Numéros de série différents, même modulus :
# openssl x509 -noout -text -in origroot.pem
Serial Number:
c0:67:16:c0:8a:6b:59:1d
...
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:bd:56:b5:26:06:c1:f6:4c:f4:7c:14:2c:0d:dd:
3c:eb:8f:0a:c0:9d:d8:b4:8c:b5:d9:c7:87:4e:25:
8f:7c:92:4d:8f:b3:cc:e9:56:8d:db:f7:fd:d3:57:
1f:17:13:25:e7:3f:79:68:9f:b5:20:c9:ef:2f:3d:
4b:8d:23:fe:52:98:15:53:3a:91:e1:14:05:a7:7a:
9b:20:a9:b2:98:6e:67:36:04:dd:a6:cb:6c:3e:23:
6b:73:5b:f1:dd:9e:70:2b:f7:6e:bd:dc:d1:39:98:
1f:84:2a:ca:6c:ad:99:8a:fa:05:41:68:f8:e4:10:
d7:a3:66:0a:45:bd:0e:cd:9d
# openssl x509 -noout -text -in newroot.pem
Serial Number:
9a:a4:7b:e9:2b:0e:2c:32
...
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:bd:56:b5:26:06:c1:f6:4c:f4:7c:14:2c:0d:dd:
3c:eb:8f:0a:c0:9d:d8:b4:8c:b5:d9:c7:87:4e:25:
8f:7c:92:4d:8f:b3:cc:e9:56:8d:db:f7:fd:d3:57:
1f:17:13:25:e7:3f:79:68:9f:b5:20:c9:ef:2f:3d:
4b:8d:23:fe:52:98:15:53:3a:91:e1:14:05:a7:7a:
9b:20:a9:b2:98:6e:67:36:04:dd:a6:cb:6c:3e:23:
6b:73:5b:f1:dd:9e:70:2b:f7:6e:bd:dc:d1:39:98:
1f:84:2a:ca:6c:ad:99:8a:fa:05:41:68:f8:e4:10:
d7:a3:66:0a:45:bd:0e:cd:9d
Allons un peu plus loin pour vérifier que cela fonctionne dans le monde réel de la validation des certificats.
Lancez une instance d'Apache, et allons-y (structure de fichier debian, ajustez si nécessaire) :
# cp cert.pem /etc/ssl/certs/
# cp origroot.pem /etc/ssl/certs/
# cp newroot.pem /etc/ssl/certs/
# cp cert.key /etc/ssl/private/
Nous allons définir ces directives dans un fichier VirtualHost
l'écoute sur 443 - rappelez-vous, le newroot.pem
Le certificat racine n'existait même pas lorsque cert.pem
a été généré et signé.
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/cert.key
SSLCertificateChainFile /etc/ssl/certs/newroot.pem
Voyons comment openssl le voit :
# openssl s_client -showcerts -CAfile newroot.pem -connect localhost:443
Certificate chain
0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=server.lan
i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
MIICHzCCAYgCCQCapHvpKw4sMjANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJB
...
-----END CERTIFICATE-----
(this should match the actual contents of newroot.pem)
...
Verify return code: 0 (ok)
Ok, et pourquoi pas un navigateur utilisant l'API cryptographique de MS ? Il faut faire confiance à la racine, d'abord, puis tout va bien, avec le numéro de série de la nouvelle racine :
Et, nous devrions toujours travailler avec l'ancienne racine, aussi. Changez la configuration d'Apache :
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
SSLCertificateKeyFile /etc/ssl/private/cert.key
SSLCertificateChainFile /etc/ssl/certs/origroot.pem
Faites un redémarrage complet d'Apache, un rechargement ne changera pas les certificats correctement.
# openssl s_client -showcerts -CAfile origroot.pem -connect localhost:443
Certificate chain
0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=server.lan
i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=root
-----BEGIN CERTIFICATE-----
MIIC3jCCAkegAwIBAgIJAMBnFsCKa1kdMA0GCSqGSIb3DQEBBQUAMFQxCzAJBgNV
...
-----END CERTIFICATE-----
(this should match the actual contents of origroot.pem)
...
Verify return code: 0 (ok)
Et, avec le navigateur MS crypto API, Apache présente l'ancienne racine, mais la nouvelle racine est toujours dans le magasin des racines de confiance de l'ordinateur. Il la trouvera automatiquement et validera le certificat par rapport à la (nouvelle) racine de confiance, même si Apache présente une chaîne différente (l'ancienne racine). Après avoir supprimé la nouvelle racine des racines de confiance et ajouté le certificat de la racine originale, tout va bien :
Alors, c'est ça ! Conservez la même clé privée lors du renouvellement, insérez la nouvelle racine de confiance, et tout est pratiquement terminé. fonctionne juste . Bonne chance !