Come posso verificare / leggere un CSR di rinnovo SSL IIS7 con OpenSSL


10

Ho il privilegio di gestire ~ 5 CSR SSL a settimana, verificandone la validità prima di trasmetterli alla nostra CA per azione. Uso OpenSSL su una macchina Ubuntu per verificarne la validità, testando cose come il nome OU corretto, un CN sensibile, dimensione della chiave> = 2048 bit e così via, poiché le nostre richieste sono talvolta errate.

L'altro giorno ho ricevuto una richiesta di rinnovo da una macchina IIS7. Non riesco a capire come leggerlo, usando OpenSSL. È valido, poiché la mia CA lo ha accettato ...

'file (1)' dice che si tratta di un "testo di richiesta di firma del certificato di sicurezza RFC1421", che è quello che dice per circa il 50% dei CSR che ho qui (il resto è "richiesta di certificato PEM").

$ head iis7rcsr
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIQsQYJKoZIhvcNAQcCoIIQojCCEJ4CAQExCzAJBgUrDgMCGgUAMIIJegYJKoZI
hvcNAQcBoIIJawSCCWcwggljMIIIzAIBADCB2zELMAkGA1UEBhMCTloxDTALBgNV
BBEMBDkwNTQxDjAMBgNVBAgMBU90YWdvMRAwDgYDVQQHDAdEdW5lZGluMRwwGgYD
...
...

openssl req, che legge CSR (PKCS # 10) non riesce a capirlo ...

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

Questo articolo di Andreas Klein sui blog di MSDN suggerisce che i CSR di rinnovo IIS7 sono un contenitore PKCS # 7, con un CSR e una firma basata sul certificato corrente ... ma non riesco ancora a leggerlo.

$ 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

Posso usare 'openssl base64' per decodificare il file e nel file binario risultante posso vedere stringhe che assomigliano al CSR e alcuni riferimenti CA che devono provenire da una firma basata sul vecchio certificato. Quindi l'idea del contenitore (CSR, firma) sembra plausibile.

Ma non riesco ancora a trovare un modo per leggere il CSR che è lì dentro! Ho provato molte cose, non elencherò qui i dettagli, ma qui ci sono gli alti punti delle variazioni che ho provato: pkcs12 pkcs7 PEM DER req x509 verifica ...

Purtroppo non posso pubblicare qui la CSR stessa. Qualcuno può aiutarmi a capire un modo di leggere / verificare questo file?


Per caso la richiesta contiene attributi che cercano un nome alternativo soggetto?
Shane Madden,

Ne dubito: è per un server interno con un solo nome. Naturalmente i certificati che otteniamo di solito hanno un campo SAN con "www". inserito forzatamente, ma viviamo con quello!
Jim Cheetham,

certutil da un computer Windows leggerà questo certificato e lo descriverà come un messaggio PKCS7, con una richiesta di certificato PKCS10 (contenente un certificato x509 dalla vecchia CA) e una catena di certificati contenente un altro certificato x509. 'certutil -split' suddivide queste parti e Blob0_1.p10 è il CSR che spero di trovare, in formato DER. Quindi mi sto avvicinando ... e sì, c'è un campo SAN nella richiesta, che è probabilmente il risultato dell'inserimento forzato di "www". quando abbiamo ottenuto la certificazione originale l'anno scorso ...
Jim Cheetham il

1
openssl asn1parseposso leggere la richiesta, e da lì posso estrarre il normale CSR. Non posso ancora rispondere autonomamente (risolto troppo in fretta), quindi aggiornerò la domanda con la soluzione e la riparerò domani :-)
Jim Cheetham,

Bello, buona scoperta!
Shane Madden,

Risposte:


8

La struttura di questa richiesta di rinnovo di IIS7 è in realtà piuttosto elegante. Sembra partire dalla premessa che, poiché si tratta di una richiesta di rinnovo di un certificato corrente , deve dimostrare che la richiesta proviene dall'host corretto, ovvero l'host che sta effettivamente utilizzando il certificato corrente e ∴ possiede il privato associato chiave. Nel mondo di Internet, dimostri di avere il permesso di richiedere il rinnovo di un certificato autenticandoti alla tua CA come utente originale, piuttosto che creare un CSR firmato.

Per dimostrare il diritto di emettere una richiesta di rinnovo, IIS7 crea un CSR normale (oggetto PKCS # 10), quindi lo firma e fornisce il certificato della chiave che lo ha firmato.

  • CSR di rinnovo IIS7
    • Dati PKCS # 7
      • Dati PKCS # 10 (il CSR ordinario)
    • Certificato del server normale
    • Emissione dei dati CA.
    • Firma RSA (presumo)

Utilizzare openssl asn1parse -in iis7rcsr -iper visualizzare la struttura del file e confrontarlo con i normali CSR. Dovresti vedere una STRETTA DI OCTET vicino all'inizio, in un oggetto etichettato ": pkcs7-data", che è quello che devi estrarre per ottenere il 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...

Per estrarre il CSR PKCS # 10 effettivo da qui, abbiamo bisogno di quel numero di offset, "58" in questo esempio. Quindi possiamo usare quell'offset per estrarre la versione binaria di quell'oggetto: -

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

Successivamente possiamo leggere quel file di output 'thecsr' con openssl req, ricordando di specificare il formato di input 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
...

Posso racchiudere tutto questo in una riga di comando senza file temporanei (ma purtroppo 2 letture del certificato originale), finché posso usare Linux /proc/self/fd/per ingannare openssl (farà trucchi nativi con descrittori di file per la gestione delle password, ma uscita non 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):
...

Questa lunga riga di comando è direttamente equivalente al semplice openssl req -in non-iis7rcsr -noout -textche utilizzo normalmente :-)



2

Grazie Jim per questa eccellente informazione che è stata di grande aiuto, ho avuto lo stesso identico problema nel tentativo di rinnovare un certificato server w2008 / IIS7.

Aggiungerei solo una cosa. Potresti essere in grado di estrarre il CSR in formato P10 direttamente con il seguente comando: certutil -split iis7rcsr (iis7rcsr è il .csr che ricevi tramite il gestore IIS). Il CSR verrà quindi estratto in un file denominato blob0_1.p10 È in formato binario (DER), potrebbe essere necessario codificarlo in base64 con il seguente comando: certutil -encode blob0_1.p10 finalcsr.csr

C'è un ultimo problema, però. Ho quindi scoperto, scaricando il contenuto .csr con openssl che il processo di rinnovo ha costretto automaticamente l'uso della chiave a 1024 bit (anche se la chiave privata originale creata sul server per il certificato del server era lunga 2048 bit). Sembra quindi che non sia possibile forzare l'uso di chiavi a 2048 bit utilizzando il processo di rinnovo di IIS7.

L'unica buona opzione sembra essere quella di creare una nuova chiave / certificato e non utilizzare il processo di rinnovo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.