Представляю вашему вниманию две библиотеки, реализующие практически полный спектр требуемого функционала для организации инфраструктуры PKI: PKIjs и вспомогательную библиотеку ASN1js. Библиотеки свободны доступны и распространяются по лицензии, позволяющей использовать их код без особых ограничений, даже в коммерческих продуктах. Полный код данных библиотек доступен на GitHub: PKIjs + ASN1js.
Дабы привлечь читателей прямо во введении приведу краткий список особенностей вышеупомянутых библиотек:
Подробнее о библиотеках и что с их помощью можно сделать.
Библиотека ASN1js представляет собой кодер/декодер ASN.1 BER данных (Basic Encoding Rules), то есть автоматически позволяет работать также и с наборами правил DER и CER. Кроме работ по кодированию/декодированию данных библиотека также позволяет создавать лёгкие для понимания схемы ASN.1 объектов, а также в дальнейшем сравнивать декодированные ASN.1 BER данные с ранее сделанными схемами.
Перечислю набор особенностей данной библиотеки:
Для библиотеки существует множество примеров (см. GitHub). Кроме того самым большим «примером» использования библиотеки ASN1js может являться другая спроектированная библиотека — PKIjs.
Данная библиотека изначально задумывалась как основа для создания полноценной структуры PKI решений, от самых простых до самых сложных. Пользователю должно быть удобно работать с ней, данные должны быть легко доступны и легко модифицируемыми. В библиотеке реализовано более 50-ти различных «helpers» для работы со всеми необходимыми структурами относящимися к PKI (вроде GeneralName, различных типов расширений X.509 сертификатов и многое другое). Библиотека имеет многослойную структуру и легко может быть модифицирована и дополнена. В GitHub вы можете посмотреть текущие планы развития данной библиотеки в разделе «Issues».
Перечислю набор особенностей данной библиотеки:
А теперь немного того, что возможно создать, используя PKIjs + ASN1js:
За вопросами по данным библиотекам можно обращаться напрямую ко мне как к автору. Ещё раз напомню репозитории для данных библиотек: ASN1js и PKIjs. Открыт для всех замечаний и предложений.
P.S.: Добавление от 07.05.2014 — забыл добавить информацию по CMS Signed Data + CSM Enveloped Data, исправил.
Дабы привлечь читателей прямо во введении приведу краткий список особенностей вышеупомянутых библиотек:
- Объектно-ориентированный код;
- Работа с HTML5 (ArrayBuffer, Promises, WebCrypto (используется «dev nightly build» Google Chrome));
- Возможность создавать, проверять, получать внутренние данные, изменять данные для следующих объектов:
- Сертификаты X.509
- Списки отзыва (CRL) X.509
- Запросы на сертификат (PKCS#10)
- OCSP запросы;
- Ответы OCSP сервера
- Time-stamping (TSP) запросы
- Ответы TSP сервера
- CMS Signed Data
- CMS Enveloped Data
- Реализация собственной «certificate chain validation engine» на JavaScript;
- … И многое другое! Смотрите под катом!
Подробнее о библиотеках и что с их помощью можно сделать.
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 и менеджмент ключей планируется к разработке в скором времени;
- Сертификаты X.509
А теперь немного того, что возможно создать, используя 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, исправил.