7.6.1 Общая информация

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

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

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