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

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

Еще один пример создания запроса на сертификат. В этом примере используются дополнительные расширения и атрибуты. Атрибуты передаются в функцию 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
}
});

Оглавление