Garder la même clé privée sur votre autorité de certification racine permet à tous les certificats de continuer à se valider avec succès sur la nouvelle racine; tout ce qui vous est demandé est de faire confiance à la nouvelle racine.
La relation de signature de 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é en fonction des besoins, maintient la relation de confiance en place. Les listes de révocation de certificats peuvent également continuer de l'ancien au nouveau certificat, car elles sont, comme les certificats, signées par la clé privée.
Alors, vérifions!
Créer 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
Signez le cert enfant:
openssl x509 -req -in cert.csr -CA origroot.pem -CAkey root.key -create_serial -out cert.pem
rm cert.csr
Tout y est défini, relation de certificat normale. Vérifions la confiance:
# openssl verify -CAfile origroot.pem -verbose cert.pem
cert.pem: OK
Ok, alors, disons maintenant 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 .. cela a-t-il fonctionné?
# 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 de manière cryptographique à la signature du certificat. Différents numéros de série, même module:
# 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 la validation de certificats dans le monde réel.
Lancez une instance Apache et testons-la (structure de fichier debian, ajustez-la 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 sur une VirtualHost
écoute sur 443 - rappelez-vous, le newroot.pem
certificat racine n'existait même pas quand il a cert.pem
é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 qu'en est-il d'un navigateur utilisant l'API crypto de MS? Il faut d'abord faire confiance à la racine, puis tout va bien, avec le numéro de série de la nouvelle racine:
Et nous devrions également continuer à travailler avec l'ancienne racine. Basculez la configuration d'Apache autour de:
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 sur 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)
De plus, avec le navigateur de l'API de chiffrement MS, Apache présente l'ancienne racine, mais la nouvelle racine est toujours dans le magasin de racines de confiance de l'ordinateur. Il le trouvera automatiquement et validera le certificat par rapport à la (nouvelle) racine approuvée, bien qu'Apache présente une chaîne différente (l'ancienne racine). Après avoir retiré la nouvelle racine des racines approuvées et ajouté le certificat racine d'origine, tout va bien:
Alors c'est tout! Conservez la même clé privée lors de votre renouvellement, remplacez-la par la nouvelle racine approuvée et tout fonctionne . Bonne chance!