7.6.1 Общая информация
Для привязки пользователя к существующей инфраструктуре открытых ключей (ИОК или PKI) в общем случае системе необходимо произвести следующую последовательность действий:
- Генерация ключевой пары на стороне пользователя. Электронный ключ (JaCarta) аппаратно генерирует новую ключевую пару.
- Генерация запроса клиентом. Приложение генерирует самоподписанный запрос в формате PKCS#10.
- Отправление запроса провайдеру. Web-приложение отправляет сформированный запрос провайдеру услуг. Провайдер передает запрос удостоверяющему центру.
- Выпуск сертификата. Удостоверяющий центр выпускает сертификат на основе полученных данных. Провайдер запрашивает сертификат у удостоверяющего центра и передает его пользователю.
- Получение пользователем готового сертификата от провайдера. Приложение записывает полученный сертификат на электронный ключ.
Предложенная схема работы описывает только основные этапы встраивания JC-WebClient в PKI-инфраструктуру. В реальных системах их количество и состав могут отличаться.
Из перечисленных задач часть должна быть реализована на уровне встраиваемого Web-приложения, в частности: создание контейнера с ключевой парой и формирование запроса на получение сертификата. Для решения этих задач используются следующие команды:
Пример с командами createKeyPair и genCSR
// Идентификатор токенаvar tokenDesc = 0;// Предъявить PIN-кодJCWebClient2.bindToken({ args: { tokenID: tokenDesc, pin: "my pin" }});// Создать контейнер с ключевой парой и присвоить ему имяvar keyPairID = JCWebClient2.createKeyPair({ args: { paramSet: "XA", description: "my description" }});// Задать отличительное имя пользователя (Distinguished Name (DN)),// включающее стандартное имя (Common Name, (CN))var dn = { 'CN': 'my CN', 'C': 'RU'};// Задать расширения, определяющие область применения закрытого ключаvar exts = { 'keyUsage': 'Digital Signature'};// Сгенерировать PKCS10 запрос на сертификатvar csr = JCWebClient2.genCSR({ args: { id: keyPairID, dn: dn, exts: exts }});- Сформированный запрос (в примере – значение переменной
CSR) необходимо направить в удостоверяющий центр. - Для записи полученного из удостоверяющего центра сертификата в контейнер воспользуйтесь функцией writeUserCertificate.
- Для записи сертификата сервера воспользуйтесь функцией writeServerCertificate. Запись сертификата позволяет впоследствии устанавливать защищенное соединение с сервером (см. Защита данных при их передаче между клиентом и сервером).
Пример
// Записать сертификат, полученный от УЦ и присвоенный переменной// certificatevar contID = JCWebClient2.writeUserCertificate({ args: { keyPairID: keyPairID, cert: certificate }});7.6.2 Генерация запроса на квалифицированный сертификат
Согласно Федеральному закону об электронной подписи (ФЗ-63) квалифицированный сертификат – это сертификат, выданный аккредитованным удостоверяющим центром или доверенным лицом аккредитованного удостоверяющего центра либо федеральным органом исполнительной власти, уполномоченным в сфере использования электронной подписи. Требования к подобному сертификату приводятся в приложении к приказу ФСБ Об утверждении требования к форме квалифицированного сертификата ключа проверки электронной подписи (№ 23041 от 27 января 2012 г.).
Сгенерировать запрос на квалифицированный сертификат с помощью JC-WebClient можно следующим образом:
Содержание и количество полей сертификата могут изменяться в зависимости от политики удостоверяющего центра.
// Сгенерировать PKCS#10 запрос сертификат с перечисленными полямиvar csr = JCWebClient2.genCSR({ args: { id: keyPairID, dn: { '2.5.4.4': 'Иванов', '2.5.4.42': 'Иван', '2.5.4.12': 'Директор департамента', '2.5.4.9': 'ул. Ивановская 99', 'CN': 'Иванов Иван', '2.5.4.11': 'Отдел маркетинга', 'O': 'ОАО "Серьезные люди"', 'L': 'г. Москва', '2.5.4.8': '79 г. Москва', 'C': 'RU', '1.2.840.113549.1.9.1': 'example@domain.ru', '1.2.643.3.131.1.1': 'NUMERICSTRING:000000000076', '1.2.643.100.1': 'NUMERICSTRING:0000000000024', '1.2.643.100.3': 'NUMERICSTRING:00000000052' }, exts: { 'certificatePolicies': ['1.2.643.100.113.1', '1.2.643.100.113.2'], 'keyUsage': ['digitalSignature', 'keyEncipherment', 'nonRepudiation', 'dataEncipherment'], 'extendedKeyUsage': ['1.3.6.1.5.5.7.3.2', '1.3.6.1.5.5.7.3.4'] } }});Еще один пример создания запроса на сертификат. В этом примере используются дополнительные расширения и атрибуты. Атрибуты передаются в функцию genCSR с помощью параметра customSignedAttributes:
// Сгенерировать PKCS#10 запрос сертификат с перечисленными полямиvar dn = { "2.5.4.4": "Иванов", "2.5.4.42": "Иван", "2.5.4.9": "ул. Ивановская 99", "CN": "Иванов Иван", "L": "г. Москва", "2.5.4.8": "г. Москва", "C": "RU", "1.2.643.3.131.1.1": "NUMERICSTRING:221052972102", "1.2.643.100.3": "NUMERICSTRING:48316823302"};var exts = { "certificatePolicies": ["1.2.643.100.113.1", "1.2.643.100.113.2"], "keyUsage": ["digitalSignature", "keyEncipherment", "nonRepudiation", "dataEncipherment"], "extendedKeyUsage": ["1.3.6.1.5.5.7.3.2", "1.3.6.1.5.5.7.3.4"], "1.2.643.100.111" :["ASN1:FORMAT:UTF8,UTF8String:Криптотокен 2 ЭП"], "1.3.6.1.4.1.311.21.7" :["ASN1:SEQUENCE:seq_section\n[seq_section]\nfield1=OID:1.2.643.2.2.50.1.9.7709003.16389888.12013114.2113904.31653.42332\nfield2=INTEGER:1\nfield3=INTEGER:0"]};var attrs = [{oid: "1.3.6.1.4.1.311.13.2.1", value: "asn1=SEQUENCE:seq_section\n[seq_section]\nfield1=BMPSTRING:CpRaCertPeriod\nfield2=BMPSTRING:20" }, { oid: "1.3.6.1.4.1.311.13.2.1", value: "asn1=SEQUENCE:seq_section\n[seq_section]\nfield1=BMPSTRING:CpRaCertPeriodUnits\nfield2=BMPSTRING:Minutes" }];JCWebClient2.genCSR({args: { id: keyPairID, dn: dn, exts: exts, customSignedAttributes: attrs}});