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)
- Dados do PKCS # 7
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: -)