ฉันจะตรวจสอบ / อ่านการต่ออายุ CSR ของ IIS7 SSL ด้วย OpenSSL ได้อย่างไร


10

ฉันมีสิทธิ์จัดการ ~ 5 CSR SSL ต่อสัปดาห์ตรวจสอบความถูกต้องก่อนส่งต่อไปยัง CA เพื่อดำเนินการ ฉันใช้ OpenSSL บนเครื่อง Ubuntu เพื่อตรวจสอบว่าถูกต้องทดสอบสิ่งต่าง ๆ เช่นชื่อ OU ที่ถูกต้อง CN ที่สมเหตุสมผลขนาดคีย์> = 2048 บิตเป็นต้นเนื่องจากบางครั้งคำขอของเราไม่ถูกต้อง

วันก่อนฉันได้รับคำขอต่ออายุจากเครื่อง IIS7 ฉันไม่สามารถหาวิธีอ่านมันได้เลยโดยใช้ OpenSSL ถูกต้องเนื่องจาก CA ของฉันยอมรับ ...

'file (1)' กล่าวว่าเป็น "ข้อความคำขอการลงนามใบรับรองความปลอดภัย RFC1421" ซึ่งเป็นสิ่งที่ระบุไว้สำหรับ ~ 50% ของ CSR ที่ฉันมีที่นี่ (ที่เหลือคือ "คำขอใบรับรอง PEM")

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

openssl reqซึ่งอ่าน CSRs (PKCS # 10) ล้มเหลวในการทำความเข้าใจ ...

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

บทความนี้จาก Andreas Klein บนบล็อก MSDNแสดงให้เห็นว่า IIS7 การต่ออายุ CSRs เป็นคอนเทนเนอร์ PKCS # 7 ที่มี CSR และลายเซ็นที่ยึดตามใบรับรองปัจจุบัน ... แต่ฉันยังไม่สามารถอ่านได้

$ 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

ฉันสามารถใช้ 'openssl base64' เพื่อถอดรหัสไฟล์และในไฟล์ไบนารีผลลัพธ์ฉันสามารถเห็นสตริงที่ดูเหมือน CSR และการอ้างอิง CA บางอย่างที่ต้องมาจากลายเซ็นที่ขึ้นกับใบรับรองเก่า ดังนั้นแนวคิดของ container (CSR, signature) จึงเป็นไปได้

แต่ฉันยังไม่สามารถหาวิธีอ่าน CSR ที่อยู่ในนั้นได้! ฉันลองหลายสิ่งหลายอย่างแล้วฉันจะไม่แสดงรายการรายละเอียดที่นี่ แต่นี่คือจุดเปลี่ยนแปลงที่สูงที่สุดที่ฉันเคยลอง: pkcs12 pkcs7 PEM DER req x509 ตรวจสอบ ...

ฉันไม่สามารถโพสต์ CSR ได้ที่นี่อย่างน่าเสียดาย ใครสามารถช่วยฉันหาวิธีอ่าน / ตรวจสอบไฟล์นี้ได้บ้าง


คำขอมีแอตทริบิวต์โดยมองหาชื่อทางเลือกของหัวเรื่องโดยบังเอิญหรือไม่
เชนหัวเสีย

ฉันสงสัย - เป็นเซิร์ฟเวอร์ภายในที่มีชื่อเดียว แน่นอนว่า certs ที่เรากลับมามักจะมีเขตข้อมูล SAN ด้วย 'www' ใช้กำลังบังคับ แต่เราอยู่กับสิ่งนั้น!
Jim Cheetham

certutil จากเครื่อง Windows จะอ่านหนังสือรับรองนี้และอธิบายว่าเป็นข้อความ PKCS7 พร้อมกับคำขอใบรับรอง PKCS10 (ประกอบด้วย x509 ใบรับรองจาก CA เก่า) และเชนใบรับรองที่มีใบรับรอง x509 อีกรายการหนึ่ง 'certutil -split' แยกส่วนเหล่านี้ออกและ Blob0_1.p10 เป็น CSR ที่ฉันหวังว่าจะพบในรูปแบบ DER ดังนั้นฉันจึงเข้ามาใกล้ ... และใช่มีช่อง SAN ในคำขอซึ่งอาจเป็นผลมาจากการบังคับให้ใส่ 'www' เมื่อเราได้รับหนังสือรับรองดั้งเดิมเมื่อปีที่แล้ว ...
Jim Cheetham

1
openssl asn1parseสามารถอ่านคำขอและจากนั้นฉันสามารถแยก CSR ปกติ ฉันยังไม่สามารถตอบตัวเองได้ (แก้ไขได้เร็วเกินไป) ดังนั้นฉันจะอัปเดตคำถามด้วยวิธีแก้ปัญหาแล้วแก้ไขในวันพรุ่งนี้ :-)
Jim Cheetham

ดีหาดี!
เชนหัวเสีย

คำตอบ:


8

โครงสร้างของการร้องขอการต่ออายุ IIS7 นี้ค่อนข้างสง่างาม ดูเหมือนว่าจะเริ่มต้นจากหลักฐานว่าเนื่องจากนี่เป็นคำขอต่ออายุใบรับรองปัจจุบันจึงต้องพิสูจน์ว่าคำขอนั้นมาจากโฮสต์ที่ถูกต้อง - นั่นคือโฮสต์ที่ใช้ใบรับรองปัจจุบันจริง & ∴เป็นเจ้าของเอกชนที่เกี่ยวข้อง สำคัญ. ในโลกอินเทอร์เน็ตคุณพิสูจน์ว่าคุณได้รับอนุญาตให้ขอต่ออายุใบรับรองโดยการตรวจสอบ CA ของคุณในฐานะผู้ใช้ดั้งเดิมแทนที่จะสร้าง CSR ที่ลงชื่อแล้ว

เพื่อพิสูจน์สิทธิ์ในการออกคำร้องขอต่ออายุ IIS7 จะสร้างวัตถุ CSR (PKCS # 10) ตามปกติจากนั้นลงนามและมอบใบรับรองของคีย์ที่ลงชื่อไว้

  • IIS7 การต่ออายุ CSR
    • ข้อมูล PKCS # 7
      • ข้อมูล PKCS # 10 (CSR ทั่วไป)
    • ใบรับรองเซิร์ฟเวอร์ปกติ
    • การออกข้อมูล CA
    • ลายเซ็น RSA (ฉันถือว่า)

ใช้openssl asn1parse -in iis7rcsr -iเพื่อดูโครงสร้างของไฟล์และเปรียบเทียบกับ CSR ทั่วไป คุณควรเห็น OCTET STRING ใกล้จุดเริ่มต้นในวัตถุที่ชื่อว่า ": pkcs7-data" ซึ่งเป็นสิ่งที่คุณต้องแยกเพื่อรับ 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...

ในการรับ CSR ที่แท้จริงของ PKCS # 10 ออกมาจากที่นี่เราจำเป็นต้องมีหมายเลขออฟเซ็ต "58" ในตัวอย่างนี้ จากนั้นเราสามารถใช้ออฟเซ็ตนั้นเพื่อแยกเวอร์ชันไบนารีของวัตถุนั้น: -

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

ต่อไปเราสามารถอ่านไฟล์เอาต์พุต 'thecsr' ด้วยopenssl req, จำเพื่อระบุรูปแบบอินพุต 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
...

ฉันสามารถห่อสิ่งเหล่านี้ทั้งหมดไว้ในบรรทัดคำสั่งเดียวโดยไม่มีไฟล์ชั่วคราว (แต่น่าเศร้าที่อ่านใบรับรองต้นฉบับ 2 ฉบับ) ตราบใดที่ฉันสามารถใช้ลีนุกซ์/proc/self/fd/เพื่อหลอก openssl (มันจะใช้เทคนิคดั้งเดิมพร้อมไฟล์อธิบายสำหรับการจัดการรหัสผ่าน แต่ ไม่ใช่เอาต์พุตปกติ)

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

บรรทัดคำสั่งยาวนี้เทียบเท่ากับความเรียบง่ายopenssl req -in non-iis7rcsr -noout -textที่ฉันใช้ :-)


มันคือเครื่องมือของ CMC tools.ietf.org/html/rfc5272#section-3.2
Daniel Fisher lennybacon

2

ขอบคุณ Jim สำหรับข้อมูลที่ยอดเยี่ยมนี้ซึ่งเป็นประโยชน์อย่างมากฉันมีปัญหาเดียวกันกับที่พยายามต่ออายุใบรับรองเซิร์ฟเวอร์ w2008 / IIS7

ฉันจะเพิ่มเพียงสิ่งเดียว คุณสามารถแยก CSR ในรูปแบบ P10 โดยตรงด้วยคำสั่งต่อไปนี้: certutil -split iis7rcsr (iis7rcsr เป็น. csr ที่คุณได้รับผ่านตัวจัดการ IIS) csr จะถูกแตกในไฟล์ชื่อblob0_1.p10 It's in binary format (DER) คุณอาจต้องเข้ารหัสใน base64 ด้วยคำสั่งต่อไปนี้: certutil -encode blob0_1.p10 finalcsr.csr

มีปัญหาสุดท้ายแม้ว่า ฉันค้นพบแล้วทิ้งเนื้อหา. csr ด้วย openssl ที่กระบวนการต่ออายุบังคับให้ใช้คีย์ 1024 บิตโดยอัตโนมัติ (แม้ว่าคีย์ส่วนตัวดั้งเดิมที่สร้างขึ้นบนเซิร์ฟเวอร์สำหรับใบรับรองเซิร์ฟเวอร์นั้นมีความยาว 2048 บิต) ดูเหมือนว่าคุณไม่สามารถบังคับใช้คีย์ 2048 บิตโดยใช้กระบวนการต่ออายุของ IIS7

ตัวเลือกที่ดีเพียงอย่างเดียวดูเหมือนว่าจะสร้างคีย์ / ใบรับรองใหม่และไม่ได้ใช้กระบวนการต่ออายุ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.