Встраивание в инфраструктуру открытых ключей

Для привязки пользователя к существующей инфраструктуре открытых ключей (PKI) в общем случае системе необходимо произвести следующую последовательность действий:

  1. Генерация ключевой пары на стороне пользователя. Электронный ключ (JaCarta) аппаратно генерирует новую ключевую пару.
  2. Генерация запроса клиентом. Плагин генерирует самоподписанный запрос в формате PKCS#10.
  3. Отправление запроса провайдеру. Web-приложение отправляет сформированный запрос провайдеру услуг. Провайдер передает запрос удостоверяющему центру.
  4. Выпуск сертификата. Удостоверяющий центр выпускает сертификат на основе полученных данных. Провайдер запрашивает сертификат у удостоверяющего центра и передает его пользователю.
  5. Получение пользователем готового сертификата от провайдера. Плагин записывает полученный сертификат на электронный ключ.

Примечание

Предложенная схема работы описывает только основные этапы встраивания 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);
}
  1. Сформированный запрос (в примере – значение переменной CSR) необходимо направить в удостоверяющий центр.
  2. Для записи полученного из удостоверяющего центра сертификата в контейнер воспользуйтесь функцией writeCertificate().
  3. Для записи открытого ключа сервера воспользуйтесь функцией 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'
  ]
);