У меня есть привилегия обрабатывать ~ 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 здесь, к сожалению. Может кто-нибудь помочь мне выяснить способ чтения / проверки этого файла?
источник
openssl asn1parse
могу прочитать запрос, и оттуда я могу извлечь нормальный CSR. Я пока не могу ответить самостоятельно (решил слишком быстро), поэтому я обновлю вопрос решением, а затем исправлю его завтра :-)Ответы:
Структура этого запроса на обновление IIS7 на самом деле довольно элегантна. Кажется, исходить из того, что, поскольку это запрос на обновление текущего сертификата, необходимо доказать, что запрос поступает с правильного хоста - то есть хоста, который фактически использует текущий сертификат и владеет ассоциированным частным ключ. В мире Интернета вы доказываете, что вам разрешено запрашивать продление сертификата, путем аутентификации в вашем ЦС в качестве исходного пользователя вместо создания подписанного CSR.
Чтобы подтвердить право на выдачу запроса на обновление, IIS7 создает обычный CSR (объект PKCS # 10), а затем подписывает его и предоставляет сертификат ключа, который его подписал.
Используйте,
openssl asn1parse -in iis7rcsr -i
чтобы увидеть структуру файла и сравнить это с обычными CSR. Вы должны увидеть строку OCTET в начале, в объекте с меткой ": pkcs7-data", который вам нужно извлечь, чтобы получить CSR.Для того чтобы получить реальный CSR PKCS # 10 отсюда, нам нужно это число смещения, «58» в этом примере. Затем мы можем использовать это смещение для извлечения двоичной версии этого объекта:
Затем мы можем прочитать этот выходной файл 'thecsr'
openssl req
, не забывая указать формат ввода DER.Я могу обернуть все это в одну командную строку без временных файлов (но, к сожалению, 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
Эта длинная командная строка прямо эквивалентна простой,
openssl req -in non-iis7rcsr -noout -text
которую я обычно использую :-)источник
Спасибо Джиму за эту прекрасную информацию, которая была очень полезна, у меня была та же самая проблема, пытаясь возобновить сертификат сервера 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.
Единственный хороший вариант - создать новый ключ / сертификат и не использовать процесс обновления.
источник