Я успешно сгенерировал 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 "]));}
Я не вижу сертификат в хранилище сертификатов браузера в списке сертификатов для аутентификации пользователя