web-dev-qa-db-fra.com

Comment savoir si le certificat est auto-signé

Comment savoir si un certificat est auto-signé ou autorisé par CA? Quelque part, j'ai lu que l'auto-signature sujet et émetteur sera la même, est-ce correct?

22
Rahul_cs12

Oui c'est vrai. Lorsque le certificat est auto-signé, le champ émetteur et sujet contient la même valeur. De plus, il n'y aura qu'un seul certificat dans le chemin du certificat.

14
Vilican

Le certificat auto-signé aura des champs d'objet et d'émetteur identiques, mais a) cela n'est pas garanti et b) l'inverse n'est pas vrai. Ce n'est pas parce que les champs ont la même valeur que le certificat est auto-signé.

Voici les sorties de l'un de nos certificats racine (root-ca.crt) et intermédiaires (ca.crt):

$ openssl x509 -subject -issuer -noout -in root-ca.crt 
subject= /C=DE/ST=Berlin/L=Berlin/O=classmarkets GmbH/CN=classmarkets CA
issuer= /C=DE/ST=Berlin/L=Berlin/O=classmarkets GmbH/CN=classmarkets CA

$ openssl x509 -subject -issuer -noout -in ca.crt 
subject= /CN=classmarkets CA/C=DE/L=Berlin/O=classmarkets GmbH/ST=Berlin
issuer= /C=DE/ST=Berlin/L=Berlin/O=classmarkets GmbH/CN=classmarkets CA

Vous pouvez voir que les champs sont les mêmes pour les deux certificats, même si ca.crt a été signé par root-ca.crt:

$ openssl x509 -noout -text -in ca.crt | grep -A1 'Key Identifier'
        X509v3 Authority Key Identifier: 
            keyid:A2:2D:AF:A0:D2:64:DF:30:F1:72:39:AC:21:AF:45:D6:D4:12:19:94
--
        X509v3 Subject Key Identifier: 
            30:B0:6B:B5:56:9A:95:7C:31:4B:B2:65:95:0D:F9:EE:E8:3D:3A:C9

$ openssl x509 -noout -text -in root-ca.crt | grep -A1 'Key Identifier'
        X509v3 Subject Key Identifier: 
            A2:2D:AF:A0:D2:64:DF:30:F1:72:39:AC:21:AF:45:D6:D4:12:19:94

Notez l'absence de Authority Key Identifier dans root-ca.crt.

RFC328 indique dans la section 4.2.1.1 (soulignement le mien):

Le champ keyIdentifier de l'extension AuthorityKeyIdentifier DOIT être inclus dans tous les certificats générés par les autorités de certification conformes pour faciliter la construction du chemin de certification. Il y a une exception; lorsqu'une AC distribue sa clé publique sous la forme d'un certificat "auto-signé", l'identifiant de clé d'autorité PEUT être omis . La signature sur un certificat auto-signé est générée avec la clé privée associée à la clé publique soumise du certificat. (Cela prouve que l'émetteur possède à la fois les clés publiques et privées.) Dans ce cas, les identificateurs de clé de sujet et d'autorité seraient identiques , mais seulement l'identifiant de la clé du sujet est nécessaire pour la construction du chemin de certification.

Il me semble donc que les Authority et Subject Key Les identificateurs sont un bien meilleur indicateur pour les certificats auto-signés que les champs Issuer et Subject. Pour un certificat auto-signé, le Authority Key Identifier sera absent ou aura la même valeur que Subject Key Identifier.

23
Peter

La réponse @Vilican est techniquement correcte et devrait faire le travail la plupart du temps. Mais je voulais savoir si un certificat que j'examinais (pas un site Web particulier) était utilisé comme certificat auto-signé ou était un certificat CA.

Ce que j'ai découvert, c'est que les certificats d'autorité de certification racine valides ont le même émetteur et le même sujet. Aussi Extensions -> Certificate Basic Constraints indique qu'il s'agit d'une autorité de certification ainsi que le nombre d'autorités de certification intermédiaires autorisées à signer par celle-ci.

Alors que les certificats auto-signés utilisés pour sécuriser un site Web généralement sont pas marqués comme CA et ont également un nom DNS comme CN dans Subject. Et/ou avoir une liste des noms DNS/adresses IP autorisés sous Extensions -> Certificate subject alt name.

3
akostadinov

Je suppose que ce n'est pas correctement de vérifier uniquement la correspondance du sujet et de l'émetteur d'un certificat. Il existe de nombreuses options où différents certificats avec des dates de début/fin différentes ou d'autres métadonnées ont le même sujet et le même émetteur. J'utilise la méthode suivante pour vérifier que le certificat est auto-signé:

openssl verify -CAfile /cert/to/check.pem -CApath /cert/to/check.pem /cert/to/check.pem

Ensuite, si cette vérification a échoué, il est possible de vérifier si le certificat est signé avec un autre certificat:

openssl verify -CAfile /cert/of/issuer.pem -CApath /cert/of/issuer.pem /cert/to/check.pem

La spécification du même certificat que CAfile et CApath empêche la vérification réussie par rapport aux certificats approuvés par défaut d'OpenSSL.

3
reddot