web-dev-qa-db-fra.com

Puis-je restreindre une autorité de certification à signer certains domaines uniquement?

Est-il possible de créer un certificat d'autorité de certification (même non signé), qui n'est autorisé à signer des certificats que pour des domaines spécifiques limités, afin qu'il ne puisse pas être utilisé à mauvais escient pour d'autres domaines?

37
Smit Johnth

Non.

(Je suppose que vous parlez de certificats pour les serveurs SSL.)

Techniquement non. Ce qui serait le plus proche serait le Name Constraints extension (voir section 4.2.1.10 de la RFC 528 ) ( OID 2.5.29. ), qui permet théoriquement de restreindre une sous-arborescence PKI complète à un ensemble explicite de domaines ( et leurs sous-domaines). L'extension prend en charge la sémantique de liste blanche et de liste noire (dans votre cas, vous souhaitez une liste blanche). En pratique, cependant, cela échoue pour deux raisons:

  • Le Name Constraints l'extension n'est généralement pas prise en charge par les implémentations existantes de SSL. Ils sont susceptibles d'ignorer l'extension.

  • Lorsqu'un client SSL se connecte à un serveur, il recherche le nom du serveur dans le certificat de serveur, comme spécifié dans RFC 2818, section 3.1 . Il recherchera les noms de type dNSName dans un Subject Alt Name extension, et ces noms sont couverts (théoriquement) par le Name Constraints. Cependant, si le certificat de serveur manque de Subject Alt Name extension, les clients se replieront sur le nom commun (dans le subjectDN). Le nom commun ne fait pas partie de la Name Constraints. Cela signifie qu'un certificat pourrait contourner les contraintes de nom en omettant le Subject Alt Name extension et en mettant un nom de serveur arbitraire dans son nom commun.

(C'est toute l'histoire de X.509: beaucoup de crochets et de dispositions pour de nombreuses fonctionnalités utiles, qui ne fonctionnent pas en raison du manque de support de la mise en œuvre et du manque de coordination entre les organismes de spécification.)

25
Thomas Pornin

Thomas Pornin 's réponse est bon, mais un peu dépassé. Soutien Name Constraints croît.

J'ai constaté que OpenSSL 1.0.1k et Windows 7 prennent en charge l'extension.

Tester

À l'aide de XCA , j'ai créé un certificat d'auto-signature CA et ajouté un Name Constraints extension pour .lab.example.com, en ajoutant la ligne suivante dans l'onglet "Avancé" lors de la création du certificat:

nameConstraints=critical,permitted;DNS:.lab.example.com

Remarque: la contrainte ne doit pas avoir un point de tête. C'est techniquement incorrect, mais le support est en train de s'élargir: https://github.com/golang/go/commit/e4dafa32620e80e4e39937d8e2033fb2ee6085f8

Ensuite, j'ai utilisé ce certificat CA pour signer deux autres certificats pour les serveurs HTTPS:

  • test.lab.example.com - Valide
  • bad.google.com - Clairement invalide

Ensuite, après avoir configuré les entrées DNS en conséquence, j'ai utilisé ceci modifié simple-https-server.py pour exécuter un serveur HTTPS, une fois avec chacun des certificats générés:

./simple-https-server --certfile test.lab.example.com.pem --hostname test.lab.example.com

et

./simple-https-server --certfile bad.google.com.pem --hostname bad.google.com

Après avoir installé le certificat CA dans la confiance du système d'exploitation, j'ai ensuite essayé de visiter chaque site avec plusieurs clients.

Résultats

OpenSSL 1.0.1k semble supporter cela. curl m'a donné l'erreur suivante lorsque j'ai essayé de visiter bad.google.com:

curl: (60) L'autorité de certification de ce certificat n'est pas autorisée à délivrer un certificat portant ce nom.

Chrome sur Windows 7 fait également ce qu'il faut. Chrome donne un _ assez générique net::ERR_CERT_INVALID, mais la visionneuse de certificats Windows est assez explicite:

Le certificat a un nom non valide. Le nom n'est pas inclus dans la liste autorisée ou est explicitement exclu.

Références


Mise à jour 1

J'ai également essayé de signer un certificat qui pas spécifiait un autre nom de sujet, en se basant plutôt sur l'ancien nom commun uniquement.

OpenSSL/curl a toujours refusé d'accepter le certificat.

Les deux Chrome et IE11 sur Windows ont refusé d'accepter le certificat sur Windows, même si Windows lui-même (lors de la visualisation du certificat du serveur) ne s'en est pas plaint. Pour moi, cela signifie que les navigateurs sont faire plus que simplement demander au système d'exploitation de vérifier le certificat, ce qui est une bonne chose.


Cependant, il semble que les contraintes de nom sont non prises en charge sur OSX .


Conclusion

Je me sens en sécurité en demandant aux autres d'installer mon certificat d'autorité de certification racine, sans les mettre en danger.

44
Jonathon Reinhart