Est-il possible de restreindre l'utilisation d'un certificat racine à un domaine

28

Mon client utilise un certificat auto-signé pour qu'une application fonctionne. Pour pouvoir travailler, je dois installer le certificat racine qu'ils ont utilisé pour signer le certificat.

Est-il possible de configurer un certificat racine pour qu'il ne valide que vers un seul domaine?

MichaelD
la source
C'est peut-être juste moi, mais je ne sais pas ce que vous demandez réellement. Quel état final essayez-vous d'accomplir? Si vous importez leur certificat racine dans la confiance des contrôleurs de domaine, alors seuls les systèmes sous ce domaine pourraient valider par rapport à lui ...
Gravy
Il semble que vous confondiez les certificats auto-signés avec l'utilisation d'une autorité de certification racine non approuvée par le public.Une application configurée pour utiliser un certificat auto-signé est très mauvaise, car l'application devrait être configurée pour ignorer les erreurs de validation de certificat. L'utilisation d'une autorité de certification racine non approuvée par le public est en fait assez courante.
Greg Askew
avez-vous un serveur CA interne?
Crypt32
1
Une autorité de certification peut se limiter à certains domaines avec des contraintes de nom , mais l'application rétroactive de contraintes à l'autorité de certification d'une autre personne est une autre affaire.
Matt Nordhoff
3
il n'y a pas de différence. Vous pouvez également appliquer des contraintes de nom à une autorité de certification tierce. Vous venez de signer un certificat d'autorité de certification racine tiers à l'aide de votre autorité de certification privée et de publier le certificat croisé généré. Dans ce cas, la chaîne étrangère se retrouvera dans votre chaîne privée via un certificat croisé restreint.
Crypt32

Réponses:

24

En règle générale:

Non , la confiance accordée à chaque certificat signé par cette autorité de certification implique implicitement la confiance dans le certificat de l'autorité de certification du client.

Je ne connais pas d'applications / bibliothèques qui ont une option simple qui vous permet en tant qu'utilisateur final de choisir que vous ferez confiance à vos clients ou à tout autre certificat CA uniquement pour certains (sous-) domaines, c'est-à-dire uniquement pour *. example.com et * .example.org et rien d'autre.

Mozilla a une préoccupation similaire à propos des autorités de certification actuellement parrainées par le gouvernement comme point d'attention ouvert et, par exemple, Chrome a des contrôles supplémentaires intégrés pour accéder aux sites Google, c'est ainsi que le certificat voyou * .google.com et le compromis de l'autorité de certification Diginotar sont devenus publics. .

Mais même si vous ne faites pas confiance à l'autorité de certification, vous pouvez toujours importer / approuver un certificat de serveur spécifique signé par cette autorité de certification, ce qui empêchera les avertissements SSL pour les noms d'hôte de ce certificat. Cela devrait permettre à votre application de fonctionner sans erreurs ni plaintes.

Exceptions:

Une option très sous-utilisée de la norme PKI X.509v3 est l' extension Name Constraints , qui permet à un certificat CA de contenir des listes blanches et noires de modèles de noms de domaine pour lesquels il est autorisé à émettre des certificats.

Vous pourriez être chanceux et votre client s'est retenu lorsqu'il a configuré son infrastructure PKI et a inclus cette contrainte de nom dans son certificat CA. Vous pouvez ensuite importer directement leur certificat CA et savoir qu'il ne peut valider qu'une plage limitée de noms de domaine.

HBruijn
la source
2
@CryptoGuy: une autorité de certification interne peut également émettre des certificats pour des domaines externes. Une fois que vous faites confiance à votre CA interne , il n'y a aucune restriction telle que seuls les certificats pour votre propre (Active Directory ou DNS) domaine example.comou *.ad.example.com sont valides. Votre autorité de certification interne peut également émettre des certificats pour *.example.bankpermettre une belle attaque d'homme au milieu et espionner vos informations bancaires en ligne.
HBruijn
1
Eh bien, "tout" n'est pas parfaitement exact. Il y a des choses comme les listes de révocation de certificats. Mais cela ne change pas le résultat.
Ben Voigt
1
désolé, vous vous trompez à nouveau. Vous pouvez restreindre l'autorité de certification tierce aux certificats de confiance (de cette autorité de certification) émis pour la liste de noms que vous souhaitez. Concernant votre propre CA interne, je suppose que la confiance est indubitable. Si vous ne faites pas confiance à votre propre autorité de certification, quelque chose ne va pas avec votre informatique. Je veux dire qu'en ayant une autorité de certification privée, OP peut établir une approbation partielle à une autorité de certification tierce (en limitant les noms auxquels ils font confiance).
Crypt32
3
À votre publication modifiée: même si une autorité de certification tierce n'a pas d'extension de contrainte de nom, il est possible de les appliquer en utilisant votre propre serveur d'autorité de certification interne via la certification croisée. Dans ce cas, la chaîne de certificats sera la suivante: certificat SSL feuille -> certificat croisé -> votre certificat CA -> votre certificat racine interne. L'astuce consiste à signer une autorité de certification tierce en utilisant votre autorité de certification interne. Et la certification croisée aura toutes les contraintes requises.
Crypt32
1
CryptoGuy dit que c'est possible, mais trouver des détails d'implémentation est difficile. Que diriez-vous d'une réponse décrivant comment cela peut être accompli? Et peut-être une discussion sur les plates-formes qui prennent en charge nameConstraints.
jorfus
17

@CryptoGuy avait une assez bonne réponse ici, mais je voulais développer cela.

Paraphraser:

Vous pouvez restreindre l'autorité de certification tierce aux certificats de confiance (de cette autorité de certification) émis pour la liste de noms que vous souhaitez. Même si une autorité de certification tierce n'a pas d'extension de contrainte de nom, il est possible de les appliquer en utilisant votre propre serveur d'autorité de certification interne via la certification croisée. L'astuce consiste à signer une autorité de certification tierce en utilisant votre autorité de certification interne.

certificat SSL leaf -> certificat croisé -> votre certificat CA -> votre certificat racine interne.

Et voici comment cela fonctionne (en utilisant la ligne de commande OpenSSL CA)

Créer une autorité de certification simple

openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -out root-ca.crt -keyout root-ca.key -subj "/CN=My Root CA"

Vous pouvez ignorer la création d'une autorité de certification intermédiaire

Créez une demande CA intermédiaire, avec des contraintes de nom.

openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg

Avec ceci dans le ossl_domain_com.cfgfichier:

[ req ]
prompt=no
distinguished_name=req_distinguished_name
req_extensions=domain_ca

[ req_distinguished_name ]
CN=somedomain.com trust CA

[ domain_ca ]
basicConstraints=critical,CA:true,pathlen:1
nameConstraints=critical,permitted;DNS:.somedomain.com

Ensuite, signez cette autorité de certification de domaine intermédiaire avec votre autorité de certification.

openssl x509 -req -in domain-ca.req -CA root-ca.crt -CAkey root-ca.key -sha256 -set_serial 1 -out domain-ca.crt -extensions domain_ca -extfile ossl_domain_com.cfg

Si vous avez ignoré la création de l'intermédiaire, utilisez votre autorité de certification racine pour signer

Maintenant, signez à nouveau l'autorité de certification du domaine d'origine sous votre autorité, à l'aide de leur certificat. Vous pouvez ajouter les extensions CA ici.

openssl x509 -in third_party_ca.crt -CA domain-ca.crt -CAkey domain-ca.key -set_serial 47 -sha256 -extensions domain_ca -extfile ossl_domain_com.cfg -out domain-cross-ca.crt

Vous devrez peut-être utiliser l' -x509-to-reqargument pour créer une demande, que vous signeriez exactement de la même manière que l'intermédiaire ci-dessus.

Maintenant, ajoutez votre autorité de certification racine, votre autorité de certification intermédiaire et le domaine-cross-ca à la base de données de confiance de votre navigateur.

davenpcj
la source
2
MacOS ne prend pas en charge les contraintes de nom. Juste FIY pour toute personne travaillant sur une autorité de certification interne contrainte par nom. security.stackexchange.com/questions/95600/… archive.is/6Clgb
jorfus
Q: quel est le statut de cette solution? Dans quels systèmes fonctionne-t-il de nos jours (2018)? // Je l'ai voulu à chaque fois que je suis obligé d'installer un autre certificat auto-signé par l'entreprise; et chaque fois que je pense au bureau de poste de Hong Kong ou à Symantec. // Je pense que je m'en fiche de ne jamais implémenter le rétrécissement ainsi décrit, tant qu'ils n'implémentent pas accidentellement un élargissement.
Krazy Glew
@KrazyGlew J'ai un fichier batch que j'utilise pour cela, et je l'utilise toujours régulièrement. Parfois, je dois rééditer les certificats intermédiaires à mesure qu'ils expirent ou tournent, c'est donc un peu plus manuel, mais cela n'a pas posé de problème. Je rencontre parfois des sites gérés par des autorités auxquels mon navigateur ne fait pas confiance en raison de l'utilisation d'une autre autorité intermédiaire ou d'un nom de domaine supplémentaire qu'ils ont ajouté, auquel le mien ne fait pas confiance.
davenpcj
2
Je viens de l'utiliser avec succès, merci. Cela fonctionne très bien sans le certificat intermédiaire, y a-t-il un avantage à en utiliser un? De plus, la basicConstraintsligne dans le fichier de configuration semble entraîner l'extension de contraintes à deux reprises dans le certificat, ce qui oblige Firefox à rejeter le certificat avec un message d'erreur cryptique. Je pense qu'il peut être retiré en toute sécurité.
wrtlprnft
Je reçois une erreur à la dernière étape: error with certificate to be certified - should be self signed. Qu'est-ce que cela signifie et comment résoudre ce problème? pastebin.ubuntu.com/p/QHhpQh2N6J
mymedia