Как я могу проверить / прочитать CSR обновления IIS7 SSL с OpenSSL

10

У меня есть привилегия обрабатывать ~ 5 SSL CSR в неделю, проверять их действительность, прежде чем передать их в наш ЦС для действий. Я использую 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, который читает 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 говорится, что CSR обновления 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, подпись) звучит правдоподобно.

Но я все еще не могу найти способ прочитать CSR, который там! Я много чего перепробовал, не буду перечислять подробности здесь, но вот основные моменты вариаций, которые я пробовал: pkcs12 pkcs7 PEM DER req x509 проверить ...

Я не могу опубликовать сам CSR здесь, к сожалению. Может кто-нибудь помочь мне выяснить способ чтения / проверки этого файла?

Джим Читам
источник
Случайно ли запрос содержит атрибуты, ищущие альтернативное имя субъекта?
Шейн Мэдден
Я сомневаюсь в этом - это для внутреннего сервера с одним именем. Конечно, сертификаты, которые мы получаем, обычно имеют поле SAN с «www». насильно вставлен, но мы живем с этим!
Джим Читам
certutil с компьютера с Windows прочитает этот сертификат и описывает его как сообщение PKCS7 с запросом сертификата PKCS10 (содержащим сертификат x509 от старого CA) и цепочкой сертификатов, содержащим еще один сертификат x509). 'certutil -split' разделяет эти части, а Blob0_1.p10 - это CSR, который я надеюсь найти в формате DER. Итак, я подхожу ближе ... и да, в запросе есть поле SAN, которое, вероятно, является результатом принудительной вставки 'www.' когда мы получили оригинальный сертификат в прошлом году ...
Джим Читам
1
openssl asn1parseмогу прочитать запрос, и оттуда я могу извлечь нормальный CSR. Я пока не могу ответить самостоятельно (решил слишком быстро), поэтому я обновлю вопрос решением, а затем исправлю его завтра :-)
Джим Читам,
Хорошо, хорошая находка!
Шейн Мэдден

Ответы:

8

Структура этого запроса на обновление IIS7 на самом деле довольно элегантна. Кажется, исходить из того, что, поскольку это запрос на обновление текущего сертификата, необходимо доказать, что запрос поступает с правильного хоста - то есть хоста, который фактически использует текущий сертификат и владеет ассоциированным частным ключ. В мире Интернета вы доказываете, что вам разрешено запрашивать продление сертификата, путем аутентификации в вашем ЦС в качестве исходного пользователя вместо создания подписанного CSR.

Чтобы подтвердить право на выдачу запроса на обновление, IIS7 создает обычный CSR (объект PKCS # 10), а затем подписывает его и предоставляет сертификат ключа, который его подписал.

  • IIS7 обновление CSR
    • Данные PKCS # 7
      • PKCS # 10 Data (обычный CSR)
    • Нормальный серверный сертификат
    • Выдача данных CA
    • Подпись RSA (я предполагаю)

Используйте, openssl asn1parse -in iis7rcsr -iчтобы увидеть структуру файла и сравнить это с обычными CSR. Вы должны увидеть строку OCTET в начале, в объекте с меткой ": 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 чтения оригинального сертификата), при условии, что я могу использовать 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которую я обычно использую :-)

Джим Читам
источник
Это CMC tools.ietf.org/html/rfc5272#section-3.2
Даниэль Фишер lennybacon
2

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

Я бы добавил только одну вещь. Вы можете извлечь CSR в формате P10 напрямую с помощью следующей команды: certutil -split iis7rcsr (iis7rcsr - это .csr, который вы получаете через IIS manager). Затем csr будет извлечен в файл с именем blob0_1.p10 Это в двоичном формате (DER), возможно, вам придется кодировать его в base64 с помощью следующей команды: certutil -encode blob0_1.p10 finalcsr.csr

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

Единственный хороший вариант - создать новый ключ / сертификат и не использовать процесс обновления.

Флоран Велу
источник