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?
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.
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
.
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
.
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.