Comment puis-je vérifier / lire un CSR de renouvellement SSL IIS7 avec OpenSSL

10

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?

Jim Cheetham
la source
Par hasard, la demande contient-elle des attributs recherchant un autre nom de sujet?
Shane Madden
J'en doute - c'est pour un serveur interne avec un seul nom. Bien sûr, les certificats que nous récupérons ont généralement un champ SAN avec «www». inséré de force, mais nous vivons avec ça!
Jim Cheetham
certutil à partir d'une machine Windows lira ce certificat et le décrit comme un message PKCS7, avec une demande de certificat PKCS10 (contenant le certificat x509 de l'ancienne autorité de certification) et une chaîne de certificats, contenant un autre certificat x509). 'certutil -split' éclate ces parties, et Blob0_1.p10 est le CSR que j'espère trouver, au format DER. Je me rapproche donc ... et oui, il y a un champ SAN dans la demande, qui est probablement le résultat de l'insertion forcée de "www". quand nous avons obtenu le certificat original l'année dernière ...
Jim Cheetham
1
openssl asn1parsepeut 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 :-)
Jim Cheetham
Nice, bonne trouvaille!
Shane Madden

Réponses:

8

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

  • RSE de renouvellement IIS7
    • Données PKCS # 7
      • Données PKCS # 10 (la RSE ordinaire)
    • Certificat de serveur normal
    • Emission de données CA
    • Signature RSA (je suppose)

Utilisez openssl asn1parse -in iis7rcsr -ipour 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.

$ openssl asn1parse -in iis7rcsr -i
0:d=0  hl=4 l=4273 cons: SEQUENCE          
4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
15:d=1  hl=4 l=4258 cons:  cont [ 0 ]        
19:d=2  hl=4 l=4254 cons:   SEQUENCE          
23:d=3  hl=2 l=   1 prim:    INTEGER           :01
26:d=3  hl=2 l=  11 cons:    SET               
28:d=4  hl=2 l=   9 cons:     SEQUENCE          
30:d=5  hl=2 l=   5 prim:      OBJECT            :sha1
37:d=5  hl=2 l=   0 prim:      NULL              
39:d=3  hl=4 l=2426 cons:    SEQUENCE          
43:d=4  hl=2 l=   9 prim:     OBJECT            :pkcs7-data
54:d=4  hl=4 l=2411 cons:     cont [ 0 ]        
58:d=5  hl=4 l=2407 prim:      OCTET STRING      [HEX DUMP]:3082096330820...

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: -

$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout

Ensuite, nous pouvons lire ce fichier de sortie «thecsr» avec openssl req, en pensant à spécifier le format d'entrée DER.

$ openssl req -in thecsr -inform DER -text -noout
Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (normal CSR Subject: line, censored)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
...

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

Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (Subject: line censored again)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
        RSA Public Key: (1024 bit)
            Modulus (1024 bit):
...

Cette longue ligne de commande est directement équivalente au simple openssl req -in non-iis7rcsr -noout -textque j'utilise normalement :-)

Jim Cheetham
la source
C'est CMC tools.ietf.org/html/rfc5272#section-3.2
Daniel Fisher lennybacon
2

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.

Florent Vélu
la source