Web Crypto API pki.js генерирует pkcs10 и импортирует подписанный сертификат - PullRequest
0 голосов
/ 07 октября 2019

Я успешно сгенерировал PKCS10 с примером на pkijs, CSR правильно подписан PKI, но импорт подписанного PEM в браузере не удался.

Этот процесс отлично работает в IE с XEnroll, но не работает с Chrome и PkiJs

PKCS10 ниже поколения работает правильно

var pkcs10Buffer = new ArrayBuffer(0);
var hashAlg = "SHA-256";
var signAlg = "RSASSA-PKCS1-V1_5";

function createPKCS10Internal(id) {
    var sequence = Promise.resolve();
    var pkcs10 = new pkijs.CertificationRequest();
    var publicKey = void 0;
    var privateKey = void 0;
    var crypto = pkijs.getCrypto();
    if (typeof crypto === "undefined") return Promise.reject("No WebCrypto extension found");

    pkcs10.version = 0;

    pkcs10.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
  type: "2.5.4.3",
  value: new asn1.Utf8String({ value: "User "+id })
 }));
 pkcs10.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
        type: "2.5.4.6", 
        value: new asn1.PrintableString({ value: "GB" })
    }));
 pkcs10.subject.typesAndValues.push(new pkijs.AttributeTypeAndValue({
  type: "2.5.4.10",
  value: new asn1.PrintableString({ value: "Company" })
 }));

    var altNames = new pkijs.GeneralNames({
  names: [new pkijs.GeneralName({
   type: 1, // rfc822Name
   value: "CN=User "+id+",O=Company"
  })]
 });

    pkcs10.attributes = [];
 sequence = sequence.then(() => {
     return crypto.generateKey(            {
            name: "RSASSA-PKCS1-v1_5",
            modulusLength: 2048,
            publicExponent: new Uint8Array([1, 0, 1]),  
            hash: {name: "SHA-256"}
        },
        true,   
        ["sign", "verify"]);  
 });
 sequence = sequence.then(keyPair => {
  publicKey = keyPair.publicKey;
  privateKey = keyPair.privateKey;
 }, error => Promise.reject(`Error during key generation: ${error}`));
 sequence = sequence.then(() => pkcs10.subjectPublicKeyInfo.importKey(publicKey));

 sequence = sequence.then(() => crypto.digest({ name: hashAlg }, pkcs10.subjectPublicKeyInfo.subjectPublicKey.valueBlock.valueHex)).then(result => {
  pkcs10.attributes.push(new pkijs.Attribute({
   type: "1.2.840.113549.1.9.14", 
   values: [new pkijs.Extensions({
    extensions: [new pkijs.Extension({
     extnID: "2.5.29.14",
     critical: false,
     extnValue: new asn1.OctetString({ valueHex: result }).toBER(false)
    }), new pkijs.Extension({
     extnID: "2.5.29.17",
     critical: false,
     extnValue: altNames.toSchema().toBER(false)
    })]
   }).toSchema()]
  }));
 });
 sequence = sequence.then(() => pkcs10.sign(privateKey, hashAlg), error => Promise.reject(`Error during exporting public key: ${error}`));

 return sequence.then(() => {
  pkcs10Buffer = pkcs10.toSchema().toBER(false);
 }, error => Promise.reject(`Error signing PKCS#10: ${error}`));
}

Но импорт enter code here n ниже не работает

функция importSignedCert (certPEM) {var crypto = pkijs.getCrypto ();if (typeof crypto === "undefined") возвращает Promise.reject ("Расширение WebCrypto не найдено");

var alg = {name: "RSA-OAEP", хэш: {name: "SHA-256 "}} window.crypto.subtle.importKey ('spki', convertPemToBinary (certPEM), alg, true, [" sign "," verify "]));}

Я не вижу сертификат в хранилище сертификатов браузера в списке сертификатов для аутентификации пользователя

...