Як я можу перевірити / прочитати CSR оновлення SSS IIS7 за допомогою OpenSSL


10

Я маю честь обробляти ~ 5 SSL CSR на тиждень, перевіряючи їх дійсність перед тим, як передавати їх до нашого КА для дій. Я використовую OpenSSL на машині Ubuntu, щоб перевірити їхню дійсність, перевіряючи такі речі, як правильне ім’я OU, розумний CN, розмір ключа> = 2048 біт і так далі, оскільки наші запити іноді невірні.

Днями я отримав запит на поновлення від машини IIS7. Я не можу зрозуміти, як це читати взагалі, використовуючи OpenSSL. Це дійсно, оскільки мій КА прийняв його ...

'файл (1)' говорить, що це "Запит тексту підпису сертифікату безпеки RFC1421", який написано для ~ 50% CSR, які я маю тут (решта - "запит PEM-сертифіката").

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

openssl req, який читає CSR (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:

Ця стаття Андреаса Кляйна з блогів MSDN передбачає, що КСВ поновлення IIS7 - це контейнер 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, які повинні бути отримані від підпису на основі старого сертифіката. Тож ідея контейнера (CSR, підпис) звучить правдоподібно.

Але я все ще не можу знайти спосіб прочитати КСВ, який там є! Я спробував багато речей, тут не буду перераховувати деталі, але ось найсильніші моменти варіантів, які я спробував: pkcs12 pkcs7 PEM DER req x509 перевірити ...

На жаль, я не можу розмістити тут саму КСВ. Чи може хто-небудь допомогти мені розібратися з способом читання / перевірки цього файлу?


Чи випадково запит містить атрибути, які шукають альтернативну назву теми?
Шейн Медден

Сумніваюсь - це для внутрішнього сервера з одним іменем. Звичайно, серти, які ми повертаємося, зазвичай мають поле SAN з 'www'. насильно вставлено, але ми живемо з цим!
Jim Cheetham

certutil з машини Windows буде читати цей серт і описується як повідомлення PKCS7, із запитом на отримання сертифіката PKCS10 (містить x509 cert від старого CA) та ланцюгом cert, що містить ще один x509 cert. 'certutil -split' розбиває ці частини, і Blob0_1.p10 - це КСВ, якого я сподіваюся знайти у форматі DER. Тож я наближаюся… і так, в запиті є поле SAN, яке, ймовірно, є результатом примусової вставки 'www'. коли ми отримали оригінал cert минулого року ...
Джим Четхем

1
openssl asn1parseя можу прочитати запит, і звідти я можу отримати звичайний КСВ. Я поки не можу самостійно відповісти (вирішив це занадто швидко), тому я оновлю питання з рішенням, а потім виправлю це завтра :-)
Джим Четхем,

Гарна, хороша знахідка!
Шейн Мадден

Відповіді:


8

Структура цього запиту на оновлення IIS7 насправді досить елегантна. Здається, це починається з передумови, що оскільки це запит на поновлення поточного сертифіката, потрібно довести, що запит надходить від правильного хоста - тобто хоста, який фактично використовує поточний сертифікат, і є власником пов'язаного приватного ключ. В Інтернеті ви доказуєте, що вам дозволено вимагати поновлення сертифіката шляхом автентифікації у вашому КА як оригінальний користувач, а не створення підписаної CSR.

Для підтвердження права на запит на поновлення IIS7 створює звичайний КСВ (об'єкт PKCS № 10), після чого підписує його та надає сертифікат ключа, який його підписав.

  • Поновлення КСВ IIS7
    • PKCS № 7 Дані
      • Дані PKCS №10 (звичайна КСВ)
    • Звичайний сертифікат сервера
    • Видача даних CA
    • Підпис RSA (я припускаю)

Використовуйте openssl asn1parse -in iis7rcsr -iдля перегляду структури файлу та порівняйте це із звичайними КСВ. Ви повинні побачити 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...

Для того, щоб вийти звідси фактичного ПКС 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 читання оригінального сертифікату), доки я можу використовувати Linux /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який я зазвичай використовую :-)



2

Дякую Джиму за цю чудову інформацію, яка була дуже корисною, у мене була та сама проблема, намагаючись відновити сертифікат сервера w2008 / IIS7.

Я додам лише одне. Ви можете отримати CSR у форматі P10 безпосередньо за допомогою наступної команди: certutil -split iis7rcsr (iis7rcsr є .csr, який ви отримуєте через менеджер IIS). Потім csr буде витягнутий у файл з назвою blob0_1.p10 Це у двійковому форматі (DER), можливо, доведеться кодувати його у base64 за допомогою наступної команди: certutil -encode blob0_1.p10 finalcsr.csr

Однак є остання проблема. Потім я виявив, скидаючи вміст .csr з openssl, що процес оновлення автоматично змусив використовувати ключ 1024 біт (навіть незважаючи на те, що початковий приватний ключ, створений на сервері для сертифіката сервера, був довжиною 2048 біт). Здається, тоді ви не можете змусити використовувати 2048 бітових ключів, використовуючи процес оновлення IIS7.

Єдиним хорошим варіантом, здається, є створення нового ключа / сертифіката та не використання процесу оновлення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.