Pergunta

Recentemente me deparei com um problema com o Windows 2003 (aparentemente também existe em outras versões), onde se um servidor SSL/TLS estiver solicitando autenticação de certificado de cliente e tiver mais de 16 KB de DNs de certificados confiáveis, Internet Explorer (ou qualquer outro aplicativo que usa schannel.dll) não consegue concluir o handshake SSL.(Resumindo, o servidor divide a mensagem em pedaços de 2 ^ 14 bytes, conforme RFC 2246 seg.6.2.1, mas o Schannel não foi escrito para suportar isso.Recebi a confirmação do suporte da Microsoft de que esta é uma falha no Schannel e que eles estão considerando corrigi-la em uma versão futura.)

Então, estou tentando encontrar uma maneira de analisar facilmente meus certificados confiáveis ​​​​(eu uso o Apache como meu servidor, então todos eles estão no formato PEM) para obter o comprimento total do formato ASN.1 dos DNs (que é como eles são enviados pela rede durante o aperto de mão) e, assim, ver se estou chegando muito perto do limite.Ainda não consegui encontrar uma maneira de fazer isso:a função OpenSSL asn1parse chega perto, mas não parece fornecer uma maneira de obter a sequência ASN.1 apenas para o nome do emissor, que é o que eu preciso.

Alguma sugestão?

Foi útil?

Solução

Como ASN.1 é autodescritivo, é bastante fácil escrever um analisador ASN.1.Como você provavelmente sabe, os dados ASN.1 contêm uma árvore de valores, onde cada tipo de valor é identificado por um OID (Object ID) atribuído globalmente.Você pode encontrar um decodificador ASN.1 gratuito com código-fonte em: http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html.Está escrito em javascript para que você possa brincar diretamente no seu navegador.

Quanto à sua pergunta exata - eu:

  1. Use o analisador fornecido, encontre outro ou escreva o meu próprio
  2. Encontre o OID de DNs confiáveis ​​(verifique a especificação ou simplesmente decodifique um certificado usando a página do decodificador ASN.1 fornecida)
  3. Combine os dois acima para extrair o tamanho dos DNs confiáveis ​​dentro de um certificado.

Outras dicas

openssl asn1parse fará isso, mas você precisará fazer algumas análises manuais para descobrir onde começa a sequência do emissor.De acordo com a RFC 5280, é o quarto item na sequência TBSCertificate (potencialmente o terceiro se for um certificado v1), imediatamente após o algoritmo de assinatura.No exemplo a seguir:

    0:d=0  hl=4 l= 621 cons: SEQUENCE
    4:d=1  hl=4 l= 470 cons:  SEQUENCE
    8:d=2  hl=2 l=   3 cons:   cont [ 0 ]
   10:d=3  hl=2 l=   1 prim:    INTEGER           :02
   13:d=2  hl=2 l=   1 prim:   INTEGER           :02
   16:d=2  hl=2 l=  13 cons:   SEQUENCE
   18:d=3  hl=2 l=   9 prim:    OBJECT            :sha1WithRSAEncryption
   29:d=3  hl=2 l=   0 prim:    NULL
   31:d=2  hl=2 l=  64 cons:   SEQUENCE
   33:d=3  hl=2 l=  11 cons:    SET
   35:d=4  hl=2 l=   9 cons:     SEQUENCE
   37:d=5  hl=2 l=   3 prim:      OBJECT            :countryName
   42:d=5  hl=2 l=   2 prim:      PRINTABLESTRING   :US
   46:d=3  hl=2 l=  26 cons:    SET
   48:d=4  hl=2 l=  24 cons:     SEQUENCE
   50:d=5  hl=2 l=   3 prim:      OBJECT            :organizationName
   55:d=5  hl=2 l=  17 prim:      PRINTABLESTRING   :Test Certificates
   74:d=3  hl=2 l=  21 cons:    SET
   76:d=4  hl=2 l=  19 cons:     SEQUENCE
   78:d=5  hl=2 l=   3 prim:      OBJECT            :commonName
   83:d=5  hl=2 l=  12 prim:      PRINTABLESTRING   :Trust Anchor
   97:d=2  hl=2 l=  30 cons:   SEQUENCE
   99:d=3  hl=2 l=  13 prim:    UTCTIME           :010419145720Z
  114:d=3  hl=2 l=  13 prim:    UTCTIME           :110419145720Z
  129:d=2  hl=2 l=  59 cons:   SEQUENCE

o DN do emissor começa no deslocamento 31 e tem um comprimento de cabeçalho de dois e um comprimento de valor de 64, para um comprimento total de 66 bytes.Isso não é tão fácil de escrever, é claro ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top