Для привязки пользователя к существующей инфраструктуре открытых ключей (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'
  ]
);