У меня есть привилегия обрабатывать ~ 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 verify ...
К сожалению, я не могу разместить здесь саму CSR. Может ли кто-нибудь помочь мне найти способ чтения / проверки этого файла?
Структура этого запроса на обновление IIS7 на самом деле довольно элегантна. Кажется, это исходит из того, что поскольку это просьба продлить ток сертификат, он должен доказать, что запрос исходит от правильного хоста, то есть хоста, который фактически использует текущий сертификат, и ∴ владеет связанным закрытым ключом. В мире Интернета вы доказываете, что вам разрешено запрашивать обновление сертификата, аутентифицируясь в своем ЦС как первоначальный пользователь, а не создавая подписанный CSR.
Чтобы подтвердить право на выдачу запроса на продление, IIS7 создает обычный CSR (объект PKCS # 10), а затем подписывает его и предоставляет сертификат ключа, которым он был подписан.
Использовать openssl asn1parse -in iis7rcsr -i
чтобы увидеть структуру файла и сравнить ее с обычными CSR. Вы должны увидеть СТРОКУ ОКТЕТОВ ближе к началу в объекте с меткой «: 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 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
...
Я могу обернуть все это в одну командную строку без временных файлов (но, к сожалению, 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
что я обычно использую :-)
Спасибо, Джим, за эту отличную информацию, которая была очень полезна, у меня была точно такая же проблема, пытаясь обновить сертификат сервера 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.
Кажется, единственный хороший вариант - создать новый ключ / сертификат и не использовать процесс обновления.