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?
sumber
openssl asn1parse
dapat 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 :-)Jawaban:
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.
Gunakan
openssl asn1parse -in iis7rcsr -i
untuk 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.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: -
Selanjutnya kita dapat membaca file output 'thecsr' dengan
openssl req
, mengingat untuk menentukan format input DER.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
Baris perintah panjang ini langsung setara dengan sederhana
openssl req -in non-iis7rcsr -noout -text
yang biasanya saya gunakan :-)sumber
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 bernamablob0_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.
sumber