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

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

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

Примечание

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

Пример

// Записать сертификат, полученный от УЦ и присвоенный переменной
// certificate
var contID = JCWebClient2.writeUserCertificate({
   args: {
      keyPairID: keyPairID,
      cert: certificate
   }
});

// Записать сертификат сервера
JCWebClient2.writeServerCertificate({
   args: {
      contID: contID,
      cert: serverCertificate
   }
});

Генерация запроса на квалифицированный сертификат

Согласно Федеральному закону об электронной подписи (ФЗ-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']
      }
   }
});