Получение строк эмитента ASN.1 из файлов PEM? - PullRequest
2 голосов
/ 16 сентября 2008

Недавно я столкнулся с проблемой Windows 2003 (по-видимому, она также существует и в других версиях), когда сервер SSL / TLS запрашивает проверку подлинности сертификата клиента и имеет более 16 КБ DN доверенных сертификатов, Internet Explorer (или любое другое приложение, которое использует schannel.dll) не может завершить рукопожатие SSL. (В двух словах, сервер разбивает сообщение на куски размером 2 ^ 14 байт, согласно RFC 2246 с. 6.2.1, но Schannel не был написан для поддержки этого. Я получил подтверждение от поддержки Microsoft, что это недостаток в Schannel и что они рассматривают его исправление в будущем выпуске.)

Поэтому я пытаюсь найти способ легко разобрать мои доверенные сертификаты (я использую Apache в качестве сервера, поэтому все они в формате PEM), чтобы получить общую длину DNN в формате ASN.1 ( именно так их отправляют по телеграфу во время рукопожатия), и, таким образом, я вижу, что я слишком близко подхожу к пределу. Я пока не смог найти способ сделать это: функция OpenSSL asn1parse подходит близко, но, похоже, она не предоставляет способ получить последовательность ASN.1 только для имени эмитента, что и является Мне нужно.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2008

Поскольку ASN.1 самоописывает себя, написать синтаксический анализатор ASN.1 довольно просто. Как вы, вероятно, знаете, данные ASN.1 содержат дерево значений, где каждый тип значения идентифицируется глобально назначенным OID (Object ID). Вы можете найти бесплатный декодер ASN.1 с исходным кодом по адресу: http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html. Он написан на javascript, поэтому вы можете играть с ним прямо в браузере.

Что касается вашего точного вопроса - я бы:

  1. Используйте прилагаемый парсер, найдите другой или напишите мой собственный
  2. Найти OID доверенных DN (проверить спецификацию или просто декодировать сертификат, используя предоставленную страницу декодера ASN.1)
  3. Объедините два приведенных выше, чтобы извлечь размер доверенных DN внутри сертификата.
0 голосов
/ 10 октября 2008

openssl asn1parse сделает это, но вам нужно будет выполнить некоторый ручной анализ, чтобы выяснить, где начинается последовательность эмитента. Согласно RFC 5280, это 4-й элемент в последовательности TBSCertificate (потенциально 3-й, если это сертификат v1), сразу после алгоритма подписи. В следующем примере:

    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

DN эмитента начинается со смещения 31 и имеет длину заголовка два и длину значения 64, для общей длины 66 байтов. Конечно, это не так просто написать ...

...