J'ai le privilège de gérer environ 5 CSR SSL par semaine, de vérifier leur validité avant de les transmettre à notre CA pour action. J'utilise OpenSSL sur une machine Ubuntu pour vérifier leur validité, en testant des choses comme le nom OU correct, un CN sensible, la taille de la clé> = 2048 bits et ainsi de suite, car nos demandes sont parfois incorrectes.
L'autre jour, j'ai reçu une demande de renouvellement d'une machine IIS7. Je ne sais pas du tout comment lire ceci, en utilisant OpenSSL. Il est valide, car mon CA l'a accepté ...
«fichier (1)» indique qu'il s'agit d'un «texte de demande de signature de certificat de sécurité RFC1421», ce qu'il indique pour environ 50% des CSR que j'ai ici (les autres sont «demande de certificat PEM»).
$ head iis7rcsr
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIQsQYJKoZIhvcNAQcCoIIQojCCEJ4CAQExCzAJBgUrDgMCGgUAMIIJegYJKoZI
hvcNAQcBoIIJawSCCWcwggljMIIIzAIBADCB2zELMAkGA1UEBhMCTloxDTALBgNV
BBEMBDkwNTQxDjAMBgNVBAgMBU90YWdvMRAwDgYDVQQHDAdEdW5lZGluMRwwGgYD
...
...
openssl req
, qui lit les CSR (PKCS # 10) ne le comprend pas ...
$ openssl req -in iis7rcsr -text
unable to load X509 request
5156:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
5156:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509_REQ_INFO
5156:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:748:Field=req_info, Type=X509_REQ
5156:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:
Cet article d'Andreas Klein sur les blogs MSDN suggère que les CSR de renouvellement IIS7 sont un conteneur PKCS # 7, avec une CSR et une signature basée sur le certificat actuel ... mais je ne peux toujours pas le lire.
$ openssl pkcs7 -in iis7rcsr -text
unable to load PKCS7 object
6581:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: PKCS7
Je peux utiliser 'openssl base64' pour décoder le fichier, et dans le fichier binaire résultant, je peux voir des chaînes qui ressemblent à la CSR, et certaines références CA qui doivent provenir d'une signature basée sur l'ancien certificat. L'idée de conteneur (CSR, signature) semble donc plausible.
Mais je n'arrive toujours pas à trouver un moyen de lire la RSE qui s'y trouve! J'ai essayé beaucoup de choses, je ne vais pas énumérer les détails ici, mais voici les points forts des variations que j'ai essayées: pkcs12 pkcs7 PEM DER req x509 vérifier ...
Je ne peux malheureusement pas publier le CSR lui-même ici. Quelqu'un peut-il m'aider à trouver un moyen de lire / vérifier ce fichier?
la source
openssl asn1parse
peut lire la demande, et à partir de là, je peux extraire le CSR normal. Je ne peux pas encore répondre par moi-même (résolu trop rapidement), je vais donc mettre à jour la question avec la solution, puis la réparer demain :-)Réponses:
La structure de cette demande de renouvellement IIS7 est en fait assez élégante. Il semble partir du principe que, puisqu'il s'agit d'une demande de renouvellement d'un certificat actuel , il doit prouver que la demande provient du bon hôte - c'est-à-dire que l'hôte qui utilise réellement le certificat actuel & ∴ possède le privé associé clé. Dans le monde Internet, vous prouvez que vous êtes autorisé à demander le renouvellement d'un certificat en vous authentifiant auprès de votre autorité de certification en tant qu'utilisateur d'origine, plutôt qu'en créant un CSR signé.
Pour prouver le droit d'émettre une demande de renouvellement, IIS7 crée un CSR normal (objet PKCS # 10), puis le signe et fournit le certificat de la clé qui l'a signé.
Utilisez
openssl asn1parse -in iis7rcsr -i
pour voir la structure du fichier et comparez-la aux CSR normales. Vous devriez voir une OCTET STRING vers le début, dans un objet intitulé ": pkcs7-data", qui est ce que vous devez extraire pour obtenir la CSR.Afin d'obtenir le CSR PKCS # 10 réel d'ici, nous avons besoin de ce numéro de décalage, "58" dans cet exemple. Ensuite, nous pouvons utiliser ce décalage pour extraire la version binaire de cet objet: -
Ensuite, nous pouvons lire ce fichier de sortie «thecsr» avec
openssl req
, en pensant à spécifier le format d'entrée DER.Je peux envelopper tout cela dans une seule ligne de commande sans fichiers temporaires (mais malheureusement 2 lectures du certificat d'origine), tant que je peux utiliser Linux
/proc/self/fd/
pour tromper openssl (il fera des tours natifs avec des descripteurs de fichiers pour la gestion des mots de passe, mais pas sortie normale).$ openssl asn1parse -in iis7rcsr -strparse $(openssl asn1parse -in iis7rcsr | grep -A2 ':pkcs7-data'|tail -1|cut -d: -f1) -out /dev/stdout -noout | openssl req -inform DER -noout -text
Cette longue ligne de commande est directement équivalente au simple
openssl req -in non-iis7rcsr -noout -text
que j'utilise normalement :-)la source
Merci Jim pour cette excellente information qui m'a été très utile, j'ai eu exactement le même problème en essayant de renouveler un certificat de serveur w2008 / IIS7.
J'ajouterais juste une chose. Vous pourrez peut-être extraire la CSR au format P10 directement avec la commande suivante:
certutil -split iis7rcsr
(iis7rcsr étant le .csr que vous obtenez via le gestionnaire IIS). Le csr sera ensuite extrait dans un fichier nomméblob0_1.p10
It's in binary format (DER), vous devrez peut-être le coder en base64 avec la commande suivante:certutil -encode blob0_1.p10 finalcsr.csr
Il y a cependant un dernier problème. J'ai ensuite découvert, en vidant le contenu .csr avec openssl, que le processus de renouvellement forçait automatiquement l'utilisation de la clé de 1024 bits (même si la clé privée d'origine créée sur le serveur pour le certificat de serveur avait une longueur de 2048 bits). Il semble alors que vous ne pouvez pas forcer l'utilisation de clés de 2048 bits en utilisant le processus de renouvellement d'IIS7.
La seule bonne option semble être de créer une nouvelle clé / certificat et de ne pas utiliser le processus de renouvellement.
la source