Como posso verificar / ler um CSR de renovação SSL7 do IIS7 com o OpenSSL

10

Tenho o privilégio de lidar com ~ 5 CSRs SSL por semana, verificando sua validade antes de repassá-los para nossa CA para ação. Eu uso o OpenSSL em uma máquina Ubuntu para verificar se eles são válidos, testando coisas como o nome da UO correto, um CN sensível, tamanho da chave > = 2048 bits e assim por diante, pois nossos pedidos são algumas vezes incorretos.

Outro dia recebi uma solicitação renovação de uma máquina do IIS7. Eu não consigo descobrir como ler isso, usando o OpenSSL. É válido, como minha CA aceitou ...

'file (1)' diz que é um "texto de solicitação de assinatura de certificado de segurança RFC1421", que é o que diz para ~ 50% dos CSRs que tenho aqui (o restante é "solicitação de certificado PEM").

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

openssl req , que lê CSRs (PKCS # 10) não consegue compreendê-lo ...

$ 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:

Este artigo de Andreas Klein nos blogs da MSDN sugere que os CSRs de renovação do IIS7 são um contêiner PKCS # 7, com um CSR e uma assinatura baseada no certificado atual ... mas ainda não consigo lê-lo.

$ 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

Eu posso usar 'openssl base64' para decodificar o arquivo, e no arquivo binário resultante eu posso ver seqüências de caracteres que se parecem com o CSR e algumas referências de CA que devem ter vindo de uma assinatura baseada no certificado antigo. Assim, a ideia de contêiner (CSR, assinatura) parece plausível.

Mas ainda não consigo encontrar uma maneira de ler o CSR que está lá! Eu tentei muitas coisas, não vou listar os detalhes aqui, mas aqui estão os pontos altos de variações que eu tentei: pkcs12 pkcs7 PEM DER req x509 verificar ...

Não posso postar o próprio CSR aqui, infelizmente. Alguém pode me ajudar a descobrir uma maneira de ler / verificar esse arquivo?

    
por Jim Cheetham 30.09.2011 / 03:08

2 respostas

7

A estrutura desta solicitação de renovação do IIS7 é realmente bastante elegante. Parece partir da premissa de que, como esse é um pedido para renovar um certificado atual , ele precisa provar que a solicitação está vindo do host correto - isto é, o host que está realmente usando a atual certificado & ∴ possui a chave privada associada. No mundo da Internet, você prova que tem permissão para solicitar renovações para um certificado, autenticando-o em sua CA como usuário original, em vez de criar um CSR assinado.

Para provar o direito de emitir uma solicitação de renovação, o IIS7 cria um CSR normal (objeto PKCS # 10), assina-o e fornece o certificado da chave que o assinou.

  • CSR de renovação do IIS7
    • Dados do PKCS # 7
      • Dados PKCS # 10 (o CSR comum)
    • Certificado de servidor normal
    • Emitindo dados da autoridade de certificação
    • assinatura RSA (suponho)

Use openssl asn1parse -in iis7rcsr -i para ver a estrutura do arquivo e compare isso com os CSRs normais. Você deve ver um STRING OCTET próximo ao início, em um objeto chamado ": pkcs7-data", que é o que você precisa extrair para obter o 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...

Para obter o CSR real do PKCS # 10 fora daqui, precisamos desse número de offset, "58" neste exemplo. Então, podemos usar esse deslocamento para extrair a versão binária desse objeto: -

$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout

Em seguida, podemos ler o arquivo de saída 'thecsr' com openssl req , lembrando-se de especificar o formato de entrada 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
...

Eu posso colocar tudo isso em uma linha de comando sem arquivos temporários (mas infelizmente 2 leituras do cert original), contanto que eu possa usar o /proc/self/fd/ do Linux para enganar o openssl (ele fará truques nativos com arquivos descritores para manipulação de senha, mas não saída normal).

$ 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):
...

Esta longa linha de comando é diretamente equivalente ao simples openssl req -in non-iis7rcsr -noout -text que eu uso normalmente: -)

    
por 03.10.2011 / 04:03
2

Obrigado Jim por esta excelente informação que foi muito útil, tive o mesmo problema ao tentar renovar um certificado de servidor w2008 / IIS7.

Eu adicionaria apenas uma coisa. Você pode extrair o CSR no formato P10 diretamente com o seguinte comando: %código% (iis7rcsr sendo o .csr que você obtém através do gerenciador do IIS). O csr será então extraído em um arquivo chamado certutil -split iis7rcsr Está no formato binário (DER), você pode ter que codificá-lo em base64 com o seguinte comando: blob0_1.p10

Existe um último problema, no entanto. Descobri então, descarregando o conteúdo .csr com o openssl, que o processo de renovação forçava automaticamente o uso da chave de 1024 bits (mesmo que a chave privada original criada no servidor para o certificado do servidor tivesse 2048 bits de comprimento). Parece que você não pode forçar o uso de chaves de 2048 bits usando o processo de renovação do IIS7.

A única boa opção parece ser criar uma nova chave / certificado e não usar o processo de renovação.

    
por 14.03.2013 / 11:29