Как сгенерировать неизвлекаемые ключи на активных токенах и обычные ключи на пассивных токенах с помощью КриптоПро ЭЦП Browser plug-in?
Опубликовано Наталья Мовчан on 2021-06-08 13:05

1. С помощью About.MediaFilter указать тип MEDIA_TYPE_SCARD, соответствующий PP_MEDIA_TYPE со значением SCARD.
2. С помощью About.ReaderFilter задать разрешенные виды носителей (PP_CARRIER_TYPES) и регулярное выражение на разрешенные режимы работы (PP_UNIQUE_FILTER)
3. При помощи интерфейса CertEnroll создать запрос на сертификат

Пример асинхронного кода:


var oAbout = yield cadesplugin.CreateObjectAsync("CAdESCOM.About");
yield oAbout.MediaFilter(cadesplugin.MEDIA_TYPE_SCARD);
yield oAbout.ReaderFilter(cadesplugin.ENABLE_ANY_CARRIER_TYPE, 0, ".*(rutoken_crypt|rutoken_lt).*"); // Для токенов jacarta: ".*(JACARTA_Crypt|JACARTA_LT).*"

var PKey = yield cadesplugin.CreateObjectAsync("X509Enrollment.CX509PrivateKey");
yield PKey.propset_ProviderName("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider");
yield PKey.propset_ProviderType(80);
yield PKey.propset_KeySpec(cadesplugin.AT_KEYEXCHANGE);

var CertificateRequestPkcs10 = yield cadesplugin.CreateObjectAsync("X509Enrollment.CX509CertificateRequestPkcs10");
yield CertificateRequestPkcs10.InitializeFromPrivateKey(0x1, PKey, "");

var DistinguishedName = yield cadesplugin.CreateObjectAsync("X509Enrollment.CX500DistinguishedName");
yield DistinguishedName.Encode("CN=\"TestName\"");
CertificateRequestPkcs10.propset_Subject(DistinguishedName);

var KeyUsageExtension = yield cadesplugin.CreateObjectAsync("X509Enrollment.CX509ExtensionKeyUsage");
var CERT_DATA_ENCIPHERMENT_KEY_USAGE = 0x10;
var CERT_KEY_ENCIPHERMENT_KEY_USAGE = 0x20;
var CERT_DIGITAL_SIGNATURE_KEY_USAGE = 0x80;
var CERT_NON_REPUDIATION_KEY_USAGE = 0x40;

yield KeyUsageExtension.InitializeEncode(
CERT_KEY_ENCIPHERMENT_KEY_USAGE |
CERT_DATA_ENCIPHERMENT_KEY_USAGE |
CERT_DIGITAL_SIGNATURE_KEY_USAGE |
CERT_NON_REPUDIATION_KEY_USAGE);
var extensions = yield CertificateRequestPkcs10.X509Extensions;
yield extensions.Add(KeyUsageExtension);

var Enroll = yield cadesplugin.CreateObjectAsync("X509Enrollment.CX509Enrollment");
yield Enroll.InitializeFromRequest(CertificateRequestPkcs10);

var certReq = yield Enroll.CreateRequest(cadesplugin.XCN_CRYPT_STRING_BASE64HEADER);


Пример синхронного кода:

var oAbout = cadesplugin.CreateObject("CAdESCOM.About");
oAbout.MediaFilter(cadesplugin.MEDIA_TYPE_SCARD);
oAbout.ReaderFilter(cadesplugin.ENABLE_ANY_CARRIER_TYPE, 0, ".*(rutoken_crypt|rutoken_lt).*"); // Для токенов jacarta: ".*(JACARTA_Crypt|JACARTA_LT).*"

var PKey = cadesplugin.CreateObject("X509Enrollment.CX509PrivateKey");
PKey.ProviderName = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider";
PKey.ProviderType = 80;
PKey.KeySpec = cadesplugin.AT_KEYEXCHANGE;

var CertificateRequestPkcs10 = cadesplugin.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10");
CertificateRequestPkcs10.InitializeFromPrivateKey(0x1, PKey, "");

var DistinguishedName = cadesplugin.CreateObject("X509Enrollment.CX500DistinguishedName");
DistinguishedName.Encode("CN=\"TestName\"");
CertificateRequestPkcs10.Subject = DistinguishedName;

var KeyUsageExtension = cadesplugin.CreateObject("X509Enrollment.CX509ExtensionKeyUsage");
var CERT_DATA_ENCIPHERMENT_KEY_USAGE = 0x10;
var CERT_KEY_ENCIPHERMENT_KEY_USAGE = 0x20;
var CERT_DIGITAL_SIGNATURE_KEY_USAGE = 0x80;
var CERT_NON_REPUDIATION_KEY_USAGE = 0x40;

KeyUsageExtension.InitializeEncode(
CERT_KEY_ENCIPHERMENT_KEY_USAGE |
CERT_DATA_ENCIPHERMENT_KEY_USAGE |
CERT_DIGITAL_SIGNATURE_KEY_USAGE |
CERT_NON_REPUDIATION_KEY_USAGE);
CertificateRequestPkcs10.X509Extensions.Add(KeyUsageExtension);

var Enroll = cadesplugin.CreateObject("X509Enrollment.CX509Enrollment");
Enroll.InitializeFromRequest(CertificateRequestPkcs10);

var certReq = Enroll.CreateRequest(cadesplugin.XCN_CRYPT_STRING_BASE64HEADER);

(6 плюсик(ов))
Класс!
Не очень :(

Коментарии (0)