Для привязки пользователя к существующей инфраструктуре открытых ключей (PKI) в общем случае системе необходимо произвести следующую последовательность действий:
Примечание
Предложенная схема работы описывает только основные этапы встраивания JC-WebClient в PKI-инфраструктуру. В реальных системах их количество и состав могут отличаться.
Из перечисленных задач часть должна быть реализована на уровне встраиваемого web-приложения, в частности: создание контейнера с ключевой парой и формирование запроса на получение сертификата. Для решения этих задач используются следующие функции:
Пример с функциями createContainer()
и genCSR()
// Предъявить PIN-код, вводимый в web-форме в поле с идентификатором regPinCode
JCWebClient().bindToken(tokenHandle.tokenID, $('#regPinCode').val());
// Создать контейнер с ключевой парой и присвоить ему имя, введенное в web-форме
// в поле с идентификатором userName
var contID = JCWebClient().createContainer("XA", $('#userName').val());
// Задать отличительное имя пользователя (Distinguished Name (DN)), включающее
// стандартное имя (Common Name, (CN)), вводимое в web-форме в поле с
// идентификатором userName
var dn = ["CN", $('#userName').val(), "C", "RU"];
// Задать расширения, определяющие область применения закрытого ключа
var exts = ["keyUsage", "Digital Signature"];
// Сгенерировать PKCS10 запрос на сертификат
var csr = JCWebClient().genCSR(contID, dn, exts);
Пример с функцией createContainerAsync()
// Запускаем индикатор выполнения
startLoadingAnimation();
// Асинхронно создать контейнер для подписи и callback-функцию, которая будет
// вызвана после создания контейнера
JCWebClient().createContainerAsync("XA", $('#userName').val(), createCont);
// Callback-функция для createContainerAsync
function createCont(contID) {
// Останавливаем индикатор выполнения
stopLoadingAnimation();
// Отличительное имя пользователя
var dn = ["CN", $('#userName').val(), "C", "RU"];
// Расширения сертификата
var exts = ["keyUsage", "digitalSignature"];
// Сгенерировать запрос на сертификат
var CSR = JCWebClient().genCSR(contID, dn, exts);
}
CSR
) необходимо
направить в удостоверяющий центр.writeCertificate()
.writeServerPublicKey()
. Запись ключа позволяет впоследствии
устанавливать защищенное соединение с сервером (см. Защита данных при их передаче между клиентом и сервером).Пример
// Записать сертификат, полученный от УЦ и присвоенный переменной
// certificate, в контейнер
JCWebClient().writeCertificate(contID, certificate);
// Записать полученный открытый ключ сервера, присвоенный переменной
// serverPublicKey, в контейнер
JCWebClient().writeServerPublicKey(contID, serverPublicKey);
Согласно Федеральному закону об электронной подписи (ФЗ-63) квалифицированный сертификат – это сертификат, выданный аккредитованным удостоверяющим центром или доверенным лицом аккредитованного удостоверяющего центра либо федеральным органом исполнительной власти, уполномоченным в сфере использования электронной подписи. Требования к подобному сертификату приводятся в приложении к приказу ФСБ Об утверждении требования к форме квалифицированного сертификата ключа проверки электронной подписи (№ 23041 от 27 января 2012 г.).
Сгенерировать запрос на квалифицированный сертификат с помощью JC-WebClient можно следующим образом:
Примечание
Содержание и количество полей сертификата могут изменяться в зависимости от политики удостоверяющего центра.
// Сгенерировать PKCS#10 запрос сертификат с перечисленными полями
var csr = JCWebClient().genCSR(
contID,
[
'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'
],
[
'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'
]
);