Bagaimana saya bisa memverifikasi / membaca CSR pembaruan IIS7 SSL dengan OpenSSL

10

Saya memiliki hak istimewa untuk menangani ~ 5 CSR SSL per minggu, memeriksa validitasnya sebelum meneruskannya ke CA kami untuk ditindaklanjuti. Saya menggunakan OpenSSL pada mesin Ubuntu untuk memeriksa apakah mereka valid, menguji hal-hal seperti nama OU yang benar, CN yang masuk akal, ukuran kunci> = 2048 bit dan seterusnya, karena permintaan kami kadang-kadang salah.

Suatu hari saya menerima permintaan perpanjangan dari mesin IIS7. Saya tidak tahu cara membaca ini sama sekali, menggunakan OpenSSL. Itu valid, karena CA saya menerimanya ...

'file (1)' mengatakan ini adalah "teks Permintaan Penandatanganan Sertifikat Keamanan RFC1421", yang dikatakan ~ 50% dari CSR yang saya miliki di sini (sisanya adalah "permintaan sertifikat PEM").

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

openssl req, yang bertuliskan CSR (PKCS # 10) gagal memahaminya ...

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

Artikel ini dari Andreas Klein di blog MSDN menunjukkan bahwa pembaruan CSR IIS7 adalah wadah PKCS # 7, dengan CSR dan tanda tangan berdasarkan sertifikat saat ini ... tapi saya masih belum bisa membacanya.

$ 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

Saya dapat menggunakan 'openssl base64' untuk men-decode file, dan dalam file biner yang dihasilkan saya dapat melihat string yang terlihat seperti CSR, dan beberapa referensi CA yang harus berasal dari tanda tangan berdasarkan sertifikat yang lama. Jadi gagasan tentang wadah (CSR, tanda tangan) terdengar masuk akal.

Tetapi saya masih tidak dapat menemukan cara membaca CSR yang ada di sana! Saya telah mencoba banyak hal, saya tidak akan mencantumkan detailnya di sini, tetapi di sini ada beberapa variasi yang telah saya coba: pkcs12 pkcs7 PEM DER req x509 memverifikasi ...

Sayangnya saya tidak dapat memposting CSR itu sendiri di sini. Adakah yang bisa membantu saya menemukan cara membaca / memverifikasi file ini?

Jim Cheetham
sumber
Secara kebetulan, apakah permintaan mengandung atribut yang mencari Nama Alternatif Subjek?
Shane Madden
Saya ragu - itu untuk server internal dengan satu nama. Tentu saja sertifikat yang kami dapatkan kembali biasanya memiliki bidang SAN dengan 'www.' dimasukkan secara paksa, tetapi kita hidup dengan itu!
Jim Cheetham
certutil dari mesin Windows akan membaca sertifikat ini, dan menjelaskan sebagai pesan PKCS7, dengan Permintaan Sertifikasi PKCS10 (berisi sertifikat x509 dari CA lama), dan rantai sertifikat, berisi sertifikat x509 lainnya). 'certutil -sitit' memecah bagian-bagian ini, dan Blob0_1.p10 adalah CSR yang saya harap temukan, dalam format DER. Jadi saya semakin dekat ... dan ya, ada bidang SAN dalam permintaan, yang mungkin merupakan hasil dari penyisipan paksa 'www.' ketika kami mendapat sertifikat asli tahun lalu ...
Jim Cheetham
1
openssl asn1parsedapat membaca permintaan, dan dari sana saya dapat mengekstrak CSR normal. Saya belum bisa menjawab sendiri (menyelesaikannya terlalu cepat) jadi saya akan memperbarui pertanyaan dengan solusinya, dan kemudian memperbaikinya besok :-)
Jim Cheetham
Bagus, temukan bagus!
Shane Madden

Jawaban:

8

Struktur permintaan pembaruan IIS7 ini sebenarnya cukup elegan. Tampaknya mulai dari premis bahwa karena ini adalah permintaan untuk memperbarui sertifikat saat ini , perlu membuktikan bahwa permintaan tersebut berasal dari host yang benar - yaitu host yang benar-benar menggunakan sertifikat saat ini & ∴ memiliki private terkait kunci. Di dunia Internet, Anda membuktikan bahwa Anda diizinkan untuk meminta perpanjangan sertifikat dengan mengautentikasi ke CA Anda sebagai pengguna asli, daripada membuat CSR yang ditandatangani.

Untuk membuktikan hak untuk mengeluarkan permintaan pembaruan, IIS7 membuat CSR normal (objek PKCS # 10), dan kemudian menandatanganinya, dan memberikan sertifikat kunci yang menandatanganinya.

  • IIS7 memperbarui CSR
    • Data PKCS # 7
      • Data PKCS # 10 (CSR biasa)
    • Sertifikat server normal
    • Mengeluarkan data CA
    • Tanda tangan RSA (saya berasumsi)

Gunakan openssl asn1parse -in iis7rcsr -iuntuk melihat struktur file, dan bandingkan dengan CSR normal. Anda harus melihat STRING OCTET di dekat awal, dalam objek yang berlabel ": pkcs7-data", yang Anda perlu ekstrak untuk mendapatkan 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...

Untuk mengeluarkan CSR PKCS # 10 yang sebenarnya dari sini, kita perlu nomor offset itu, "58" dalam contoh ini. Kemudian kita dapat menggunakan offset itu untuk mengekstrak versi biner dari objek itu: -

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

Selanjutnya kita dapat membaca file output 'thecsr' dengan openssl req, mengingat untuk menentukan format 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
...

Saya bisa membungkus semua ini menjadi satu command-line tanpa file sementara (tapi sayangnya 2 membaca sertifikat asli), selama saya bisa menggunakan Linux /proc/self/fd/untuk menipu openssl (itu akan melakukan trik asli dengan deskriptor file untuk penanganan kata sandi, tetapi bukan keluaran normal).

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

Baris perintah panjang ini langsung setara dengan sederhana openssl req -in non-iis7rcsr -noout -textyang biasanya saya gunakan :-)

Jim Cheetham
sumber
Ini CMC tools.ietf.org/html/rfc5272#section-3.2
Daniel Fisher lennybacon
2

Terima kasih Jim atas informasi yang luar biasa ini yang sangat membantu, saya mempunyai masalah yang sama persis ketika mencoba memperbarui sertifikat server w2008 / IIS7.

Saya akan menambahkan satu hal saja. Anda mungkin dapat mengekstrak CSR dalam format P10 secara langsung dengan perintah berikut: certutil -split iis7rcsr (iis7rcsr menjadi .csr yang Anda dapatkan melalui manajer IIS). CSr kemudian akan diekstraksi dalam file bernama blob0_1.p10 Ini dalam format biner (DER), Anda mungkin harus menyandikannya di base64 dengan perintah berikut: certutil -encode blob0_1.p10 finalcsr.csr

Namun, ada masalah terakhir. Saya kemudian menemukan, membuang konten .csr dengan openssl bahwa proses pembaruan secara otomatis memaksa penggunaan kunci 1024 bit (meskipun kunci pribadi asli yang dibuat pada server untuk sertifikat server memiliki panjang 2048 bit). Tampaknya Anda tidak dapat memaksakan penggunaan kunci 2048 bit menggunakan proses pembaruan IIS7.

Satu-satunya pilihan yang baik adalah membuat kunci / sertifikat baru dan tidak menggunakan proses pembaruan.

Florent Vélu
sumber