пятница, 17 февраля 2012 г.

Проверка российских сертификатов вне OpenSSL

Я не знаю зачем я это делаю. Наверно, как нет оправдания покорению горных вершин. Написал прогу.
Прога умеет сначала с сертификата снимать BASE64 так из PEM получается DER. Потом из DER разбирается структура и в соответствии с описанием создается стркутура данных, или заполняется. получается уже то, с чем можно работать, например проверить дату, можно ли использовать сертификат. Потом можно выделить подпись и номер сертификата, потом запаковать обратно  в DER и послать на сервер OCSP для проверки валидности. А началось все с простого. Я решил использовать для проверки сертификатов OpenSSL, а он подвис. А потом не стал выделять русские буквы из сертификата Микрософт, не признавал идентификаторы Микрософт, не признавал идентификаторы российских алгоритмов. А когда я посчитал сколько времени разгребается список отозванных сертификатов из 6тыс штук, ужаснулся и решил написать свою службу, чтобы не тратила время на разбор списков сертификатов, а была к этому готова. Чтобы все списки сертфикатов лежали в хеш таблицах, а сами сертификаты в базе данных LDAP. Такую вот штуку решил соорудить. Научился разгребать сертификаты типа CRL/CER/PEM/DER и подружился с отечественными идентификаторами алгоритмов. С грустью подумал, как попали те организации, которые связали свою жизнь с Микрософтом и Крипто-про.

8 комментариев:

  1. Самое смешное, что я тоже занялся чем-то похожим: прикручиваю ГОСТы к libgcrypt :)

    ОтветитьУдалить
  2. P.S. Очень странно, что OpenSSL отказывается работать с КриптоПрошными сертификатами. Вроде бы КриптоКом писали поддержку так, чтобы было совместимо.

    ОтветитьУдалить
  3. У меня вешался OpenSSL в режиме сервера OCSP. И не отображались русские буквы в реквизитах сертификата, потому что винда каждый символ кодировала как два байта.

    ОтветитьУдалить
  4. С OCSP не сталкивался. utf-16 без BOM? или utf-8? или как?

    ОтветитьУдалить
  5. Скорее или как, сработало применение к каждому двухбайтовому символу g_unichar_to_utf8 (glib). Порядок следования байт от старшего к младшему.

    ОтветитьУдалить
  6. Больше всего слов про данный способ кодирования нашел у микрософта который как раз и породил этот способ кодирования в сертификатах: "The ASN.1 BMPString data type, called a UNICODE_STRING in the Certificate Enrollment API, is encoded into a TLV triplet that begins with a Tag byte of 0x1E." Затем нашел упоминание о том что BMPString может быть UCS-2 [RFC 3641]. Потом нашел как может кодироваться UCS-2 в UTF-8 [RFC 3629]. Но на самом деле все было иначе я увидел вместо русских букв \04E\04C\049 и решил что это наверное уникод и дальше просто применил преобразование.

    ОтветитьУдалить
  7. Понятно. А OpenSSL, наверное, писали американцы, которые считают, что кроме US-ASCII других сстрок не бывает.

    ОтветитьУдалить
  8. не в этом проблемы. В DER есть тип строки UTF8String, в котором как раз очень удобно русские буквы писать, да только микрософт изобрел что-то свое, чтобы не конвертировать свое внутреннее представление

    ОтветитьУдалить