Для привязки пользователя к существующей инфраструктуре открытых ключей (PKI) в общем случае системе необходимо произвести следующую последовательность действий:
Примечание
Предложенная схема работы описывает только основные этапы встраивания 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
}
});
CSR
) необходимо
направить в удостоверяющий центр.Пример
// Записать сертификат, полученный от УЦ и присвоенный переменной
// 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
}
});