Пользователь
0,0
рейтинг
5 мая 2014 в 15:00

Разработка → PKI (Public Key Infrastructure) с помощью JavaScript? Теперь это возможно с помощью библиотек PKIjs и ASN1js

Представляю вашему вниманию две библиотеки, реализующие практически полный спектр требуемого функционала для организации инфраструктуры PKI: PKIjs и вспомогательную библиотеку ASN1js. Библиотеки свободны доступны и распространяются по лицензии, позволяющей использовать их код без особых ограничений, даже в коммерческих продуктах. Полный код данных библиотек доступен на GitHub: PKIjs + ASN1js.

Дабы привлечь читателей прямо во введении приведу краткий список особенностей вышеупомянутых библиотек:
  1. Объектно-ориентированный код;
  2. Работа с HTML5 (ArrayBuffer, Promises, WebCrypto (используется «dev nightly build» Google Chrome));
  3. Возможность создавать, проверять, получать внутренние данные, изменять данные для следующих объектов:
    1. Сертификаты X.509
    2. Списки отзыва (CRL) X.509
    3. Запросы на сертификат (PKCS#10)
    4. OCSP запросы;
    5. Ответы OCSP сервера
    6. Time-stamping (TSP) запросы
    7. Ответы TSP сервера
    8. CMS Signed Data
    9. CMS Enveloped Data

  4. Реализация собственной «certificate chain validation engine» на JavaScript;
  5. … И многое другое! Смотрите под катом!


Подробнее о библиотеках и что с их помощью можно сделать.

ASN1js


Библиотека ASN1js представляет собой кодер/декодер ASN.1 BER данных (Basic Encoding Rules), то есть автоматически позволяет работать также и с наборами правил DER и CER. Кроме работ по кодированию/декодированию данных библиотека также позволяет создавать лёгкие для понимания схемы ASN.1 объектов, а также в дальнейшем сравнивать декодированные ASN.1 BER данные с ранее сделанными схемами.

Перечислю набор особенностей данной библиотеки:
  • Полностью объектно-ориентированный код, постоянное использование возможностей наследования;
  • Работа с объектами из стандарта HTML5 (ArrayBuffer)
  • Работа со всеми типами данных ASN.1:2008
  • Все типы данных из данной библиотеки сохраняют информацию обо всех подблоках: идентификационном подблоке (tag), подблоке длины (length) и подблоке значения (value);
  • Пользователь в любое время может получить доступ к любому отдельно взятому байту из любого подблока;
  • Все подблоки могут иметь неограниченную длину, как это и описано в стандарте (даже идентификационный подблок);
  • Полноценная работа со всеми строковыми типами данных ASN.1, включая типы, работающие с «интернациональными» строками: UniversalString, BMPString, UTF8String. В качестве входных данных для конструктора любого строкового ASN.1 типа может быть использована стандартная строка из JavaScript. Также верно и обратное — при декодировании любого строкового типа данных ASN.1 автоматически происходит декодирование в стандартную строку JavaScript (сохраняется в виде поля объекта);
  • То же самое верно и для типов данных ASN.1 вида «date-time». Для основных типов данных (UTCTime и GeneralizedTime) существует возможность инициализации с помощью обычного JavaScript объекта типа «Date». Верно и обратное преобразование — при декодировании автоматически значения данных типов декодируются в JavaScript тип «Date»;
  • Работа с легкими для понимания ASN.1 схемами;
  • Библиотека предоставляет следующие специальные типы для работы с ASN.1 схемами:
    • ANY
    • CHOICE
    • REPEATED

  • Пользователь может создать именованные блоки внутри ASN.1 схемы и в дальнейшем по имени получать необходимые ASN.1 данные;
  • Все типы внутри библиотеки являются динамическими;
  • Все типы библиотеки могут быть инициализированы как динамически, так и посредством передачи статических данных в конструктор;


Для библиотеки существует множество примеров (см. GitHub). Кроме того самым большим «примером» использования библиотеки ASN1js может являться другая спроектированная библиотека — PKIjs.

PKIjs


Данная библиотека изначально задумывалась как основа для создания полноценной структуры PKI решений, от самых простых до самых сложных. Пользователю должно быть удобно работать с ней, данные должны быть легко доступны и легко модифицируемыми. В библиотеке реализовано более 50-ти различных «helpers» для работы со всеми необходимыми структурами относящимися к PKI (вроде GeneralName, различных типов расширений X.509 сертификатов и многое другое). Библиотека имеет многослойную структуру и легко может быть модифицирована и дополнена. В GitHub вы можете посмотреть текущие планы развития данной библиотеки в разделе «Issues».

Перечислю набор особенностей данной библиотеки:
  • Полностью объектно-ориентированный код;
  • Работа с типами данных из последних стандартов (ArrayBuffer, Promises, WebCrypto (используется последний ночной билд Google Chrome));
  • Имеет полный набор объектов для работы с вспомогательными типами, таких как:
    • GeneralName;
    • RelativeDistinguishedName;
    • Time;
    • AlgorithmIdentifier;
    • Все стандартные типы расширений сертификатов X.509;
    • Все вспомогательные объекты для работы с OCSP запросами и ответами;
    • Все вспомогательные объекты для работы с Time-stamping protocol (TSP);

  • Реализована собственная функция проверки пути сертификата (certificate chain engine) полностью на JavaScript, с применением Promises и WebCrypto;
  • Реализована работа со всеми основными типами данных, имеющих отношение к PKI:
    • Сертификаты X.509
      • Получение информации обо всех полях сертификата, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания сертификата «с нуля»;
      • Встроенная «certification chain validation engine»;

    • Списки отзыва сертификатов (CRL) X.509
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания CRL «с нуля»;
      • Возможность проверки корректности цифровой подписи CRL;
      • Встроенная функция поиска сертификата на вхождение в CRL;

    • Запросы на сертификат PKCS#10
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания PKCS#10 «с нуля»;
      • Возможность проверки корректности цифровой подписи PKCS#10;

    • OCSP запросы
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания OCSP запроса «с нуля»;

    • Ответы OCSP сервера
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания ответа OCSP сервера «с нуля»;
      • Возможность проверки корректности цифровой подписи ответа OCSP сервера;

    • Запросы Time-stamping protocol (TSP)
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания запроса TSP «с нуля»;
      • Возможность проверки корректности цифровой подписи запроса TSP;

    • Ответы TSP сервера
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания ответа TSP сервера «с нуля»;
      • Возможность проверки корректности цифровой подписи ответа TSP сервера;

    • CMS Signed Data
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания CMS Signed Data «с нуля»;
      • Возможность проверки корректности цифровой подписи CMS Signed Data;

    • CMS Enveloped Data
      • Получение информации обо всех полях структуры, включая вложенные;
      • Создание и модификация любых внутренних структур;
      • Возможность создания CMS Enveloped Data и менеджмент ключей планируется к разработке в скором времени;




А теперь немного того, что возможно создать, используя PKIjs + ASN1js:
  • Удостоверяющий центр полностью на JavaScript;
  • OCSP сервер полностью на JavaScript;
  • TSP сервер полностью на JavaScript;
  • Клиенты OCSP и TSP серверов полностью на JavaScript;
  • «Cryptographic workbench» вроде «КриптоАРМ» полностью на JavaScript;
  • Средства работы с S/MIME;
  • Библиотеку по работе с CAdES;
  • Различные библиотеки поддержки работы с цифровыми подписями в документах на Web-страницах;
  • И многое другое!


За вопросами по данным библиотекам можно обращаться напрямую ко мне как к автору. Ещё раз напомню репозитории для данных библиотек: ASN1js и PKIjs. Открыт для всех замечаний и предложений.

P.S.: Добавление от 07.05.2014 — забыл добавить информацию по CMS Signed Data + CSM Enveloped Data, исправил.
Юрий Строжевский @ystr
карма
30,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (18)

  • +1
    Это для тех, кому невмоготу дождаться WebCrypto?
    • +1
      Собственно PKIjs использует WebCrypto в реализации от Google (которая уже присутствует в «nightly build of Google Chrome»). Так что никаких противопоставлений тут нет: PKIjs использует WebCrypto, реальное, сделанное в соответствие с последним стандартом.
    • +2
      Кстати насколько мне известно в течение нескольких недель должна также появится и реализация WebCrypto от Mozilla, которую также автоматически поддержит код PKIjs.
  • 0
    Эх, только обрадовался, а тут: Basically at this time it only works on Chrome developer channel builds.
    • 0
      Ну что же поделать :) Но они обещают скорейшую всеобщую победу коммунизма — скоро везде и всюду будет WebCrypto. А у меня уже и библиотека готова :)
      • +1
        там, где бы это можно было бы использовать — очень еще нескоро. а что мешает сделать чистую js реализацию? и использовать апи только, если есть?
        • 0
          То, что в скором времени везде будет WebCrypto. Looking forward :)
    • 0
      Кстати весь код ASN1js и большинство кода PKIjs работает во всех современных браузерах. Зависимости от WebCrypto только в части создания и проверки подписей.
      • 0
        так самое ж самое вкусное :)
        • 0
          Есть такие реализации уже сейчас. Но они реально бесперспективны. WebCrypto раз и навсегда вытеснит такие решения и будет это происходить уже в этом году, очень-очень скоро.
          • +1
            Гм… ссылочку можно? Ну пока у части клиентов будет что-то типа IE8 стоять (а именно в банках, где самое место такой штуке) — без возможности использовать на старых браузерах, сложно будет.
            • +1
              Вот этот человек — the best, IMHO. Есть также такое вот решение — временный «костыль» до реализации полноценного WebCrypto.
              • 0
                О, спасибо, посмотрю!
                • 0
                  Кстати на всякий случай предостерегу от использования PolyCrypt: данный продукт, похоже, более не поддерживается — по моим сведениям автора переманили в Mozilla. Кроме того в данном продукте существуют ошибки при реализации работы с криптографическими преобразованиями: иногда у меня случались ошибки при верификации заведомо корректных подписей. Также в PolyCrypt используется часть библиотеки от Kenji Urushima. Так что я реально не советую использовать PolyCrypt в перспективных проектах (к сожалению сам потратил примерно месяц приводя её в порядок). Кроме того текущая версия PolyCrypt не поддерживает последний стандарт WebCrypto.
                • 0
                  Кстати вот ещё хорошая библиотека.
  • +2
    Ох… просто замечательные библиотеки. В свое время делал нечто похожее, только с интерфейсом.
    • 0
      Да, GlobalSign уже тоже сделал на базе моих библиотек что-то похожее и с интерфейсом :) Правда пока вне общего доступа — что-то для внутренних нужд клиентов.
  • 0
    Вчера появилась поддержка WebCrypto, Promises и IndexDB в «ночном» билде Safari/WebKit.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.