मैं OpenSSL के साथ IIS7 SSL नवीनीकरण CSR को कैसे सत्यापित / पढ़ सकता हूँ


10

मेरे पास प्रति सप्ताह ~ 5 एसएसएल सीएसआर को संभालने का विशेषाधिकार है, कार्रवाई के लिए हमारे सीए को पास करने से पहले उनकी वैधता की जांच करना। मैं UbuntuSS मशीन पर OpenSSL का उपयोग यह जांचने के लिए करता हूं कि वे सही हैं, सही OU नाम, एक समझदार CN, कुंजी आकार> = 2048 बिट्स और इसी तरह की चीजों का परीक्षण, क्योंकि हमारे अनुरोध कभी-कभी गलत होते हैं।

दूसरे दिन मुझे IIS7 मशीन से नवीनीकरण का अनुरोध मिला । मैं यह पता नहीं लगा सकता कि ओपनएसएसएल का उपयोग करके इसे कैसे पढ़ा जाए। यह मान्य है, क्योंकि मेरे सीए ने इसे स्वीकार कर लिया है ...

'फाइल (1)' यह "RFC1421 सिक्योरिटी सर्टिफिकेट साइनिंग रिक्वेस्ट टेक्स्ट" कहती है, जो कि मेरे पास यहां मौजूद CSR के ~ 50% के लिए कहती है (बाकी "PEM सर्टिफिकेट रिक्वेस्ट" हैं)।

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

openssl req, जो सीएसआर (पीकेसीएस # 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:

MSDN ब्लॉग पर एंड्रियास क्लेन का यह लेख बताता है कि IIS7 नवीकरण CSR एक 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

मैं फ़ाइल को डीकोड करने के लिए 'ओपनएसएल बेस 64' का उपयोग कर सकता हूं, और परिणामस्वरूप बाइनरी फ़ाइल में मैं सीएसआर की तरह दिखने वाले तार और कुछ सीए संदर्भ देख सकता हूं जो पुराने प्रमाण पत्र के आधार पर हस्ताक्षर से आए होंगे। तो कंटेनर (सीएसआर, हस्ताक्षर) का विचार प्रशंसनीय लगता है।

लेकिन मुझे अभी भी सीएसआर पढ़ने का एक तरीका नहीं मिल रहा है जो वहां है! मैंने बहुत सी चीजों की कोशिश की है, मैं यहां विवरणों को सूचीबद्ध नहीं करूंगा, लेकिन यहां उन विविधताओं के उच्च बिंदु हैं जो मैंने कोशिश की हैं: pkcs12 pkcs7 PEM DER req x509 सत्यापित करें ...

मैं यहाँ दुर्भाग्य से CSR पोस्ट नहीं कर सकता। क्या कोई मुझे इस फ़ाइल को पढ़ने / सत्यापित करने के तरीके का पता लगाने में मदद कर सकता है?


संयोग से अनुरोध में विषय वैकल्पिक नाम की तलाश वाले गुण होते हैं?
शेन मैडेन

मुझे संदेह है - यह एक एकल नाम के साथ आंतरिक सर्वर के लिए है। बेशक, हमें जो अनाज मिलता है, वह आमतौर पर एक होता है SAN 'www।' जबरन डाला, लेकिन हम उसी के साथ रहते हैं!
जिम चीथम

विंडोज मशीन से सर्टिफिकेट इस सर्टिफिकेट को पढ़ेगा, और इसका वर्णन PKCS7 संदेश के रूप में है, जो PKCS10 सर्टिफिकेट रिक्वेस्ट (पुराने सीए से x509 सर्टिफिकेट), और एक सर्टिफिकेट चेन, जिसमें एक और x509 सर्टिफिकेट है, के साथ है। 'certutil -split' इन भागों को तोड़ता है, और Blob0_1.p10 CSR है जिसे मैं DER प्रारूप में खोज रहा हूँ। इसलिए मैं करीब आ रहा हूं ... और हां, अनुरोध में एक SAN फील्ड है, जो संभवतः 'www' के जबरन सम्मिलन का परिणाम है। जब हमें पिछले साल मूल प्रमाणपत्र मिला ...
जिम चीथम

1
openssl asn1parseअनुरोध पढ़ सकते हैं, और वहां से मैं सामान्य CSR निकाल सकते हैं। मैं अभी तक स्व-उत्तर नहीं दे सकता हूं (इसे बहुत जल्दी हल कर दिया है) इसलिए मैं प्रश्न को हल के साथ अपडेट करूंगा, और फिर इसे कल ठीक कर दूंगा :-)
जिम चीथम

अच्छा लगा, अच्छा लगा!
शेन मैडेन

जवाबों:


8

इस IIS7 नवीनीकरण अनुरोध की संरचना वास्तव में काफी सुरुचिपूर्ण है। यह इस आधार से शुरू होता है कि क्योंकि यह एक वर्तमान प्रमाणपत्र को नवीनीकृत करने का अनुरोध है , इसलिए यह साबित करने की आवश्यकता है कि अनुरोध सही मेजबान से आ रहा है - अर्थात वह होस्ट जो वास्तव में वर्तमान प्रमाण पत्र का उपयोग कर रहा है और ∴ संबंधित निजी का मालिक है चाभी। इंटरनेट की दुनिया में, आप एक प्रमाणित CSR बनाने के बजाय अपने CA को मूल उपयोगकर्ता के रूप में प्रमाणित करके प्रमाणपत्र के नवीनीकरण के लिए अनुरोध करने की अनुमति देते हैं।

नवीनीकरण अनुरोध जारी करने के अधिकार को साबित करने के लिए, IIS7 एक सामान्य CSR (PKCS # 10 ऑब्जेक्ट) बनाता है, और फिर उस पर हस्ताक्षर करता है, और उस हस्ताक्षरित कुंजी का प्रमाण पत्र प्रदान करता है।

  • IIS7 नवीनीकरण CSR
    • PKCS # 7 डेटा
      • PKCS # 10 डेटा (साधारण CSR)
    • सामान्य सर्वर प्रमाणपत्र
    • CA डेटा जारी करना
    • RSA हस्ताक्षर (मुझे लगता है)

openssl asn1parse -in iis7rcsr -iफ़ाइल की संरचना को देखने के लिए उपयोग करें , और सामान्य CSR से इसकी तुलना करें। आपको ": pkcs7-data" लेबल की गई वस्तु में शुरुआत के पास एक OCTET STRING दिखना चाहिए, जिसे आपको 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...

यहां से वास्तविक PKCS # 10 CSR प्राप्त करने के लिए, हमें इस उदाहरण में ऑफसेट संख्या "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
...

जब तक मैं लिनक्स की /proc/self/fd/मूर्खतापूर्ण ओपनसेल का उपयोग कर सकता हूं, तब तक यह सब एक कमांड लाइन में हो सकता है, जिसमें कोई अस्थायी फाइल नहीं है (लेकिन दुख की बात है कि मूल प्रमाणपत्र की 2 पुस्तकें) सामान्य उत्पादन नहीं)।

$ 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जिसका मैं सामान्य रूप से उपयोग करता हूं :-)



2

इस उत्कृष्ट जानकारी के लिए धन्यवाद जिम, जो बहुत मददगार था, मुझे वही समस्या थी जो w2008 / IIS7 सर्वर प्रमाणपत्र को नवीनीकृत करने की कोशिश कर रही थी।

मैं सिर्फ एक चीज जोड़ूंगा। आप निम्नलिखित कमांड के साथ सीधे पी 10 प्रारूप में सीएसआर निकालने में सक्षम हो सकते हैं: certutil -split iis7rcsr (आईआईएस मैनेजर के माध्यम से प्राप्त होने वाले आईसीआर 7rcsr)। सीएसआर को इसके बाद blob0_1.p10 बाइनरी फॉर्मेट (डीईआर) नामक फाइल में निकाला जाएगा , आपको इसे निम्नलिखित कमांड के साथ बेस 64 में एनकोड करना पड़ सकता है: certutil -encode blob0_1.p10 finalcsr.csr

एक अंतिम समस्या है, हालांकि। मैंने तब पता लगाया। ओपनर्सएल के साथ .csr सामग्री को डंप करना कि नवीनीकरण प्रक्रिया ने स्वचालित रूप से 1024 बिट्स कुंजी का उपयोग करने के लिए मजबूर किया (भले ही सर्वर प्रमाणपत्र के लिए सर्वर पर बनाई गई मूल निजी कुंजी 2048 बिट्स लंबाई थी)। ऐसा लगता है कि आप IIS7 की नवीनीकरण प्रक्रिया का उपयोग करके 2048 बिट्स कुंजियों के उपयोग को बाध्य नहीं कर सकते।

एकमात्र अच्छा विकल्प एक नई कुंजी / प्रमाण पत्र बनाने और नवीनीकरण प्रक्रिया का उपयोग न करने के लिए प्रतीत होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.