API веб-шифрования crypto.subtle не определен в Apache Cordova
Я работаю с Cordova и создаю библиотеку и Web Crypto API браузера для выполнения операций sign и importKey. Тем не менее, Web Crypto API на устройстве Android предлагает только crypto.getRandomValues (), а SubtleCrypto не определено (crypto.subtle). Поэтому я подумал, что добавление Web Crypto API shrim и его зависимость от Promiz исправят эту ссылку, но ничего не изменилось. Любая идея, пожалуйста?
Отладка на ПК в Chrome 52.0.2743.116 предлагает полный API веб-шифрования, однако на устройстве Android с версией Chrome 52.0.2743.98 с Android 4.4.4. веб-API ограничен только crypto.getRandomValues ().
Я в основном переписываю ответ из Как загрузить цифровой сертификат PKCS#12 с Javascript WebCrypto API
Пример кода:
Внутри index.html
<script src="lib/promiz.min.js"></script>
<script src="lib/webcrypto-shim.js"></script>
Внутри файла JavaScript
//working with forge without issue
var pkcs12Der = forge.util.decode64(pk);
var pkcs12Asn1 = forge.asn1.fromDer(pkcs12Der);
var pkcs12 = forge.pkcs12.pkcs12FromAsn1(pkcs12Asn1, false, "password");
console.log(pkcs12);
privateKey = null;
// load keypair and cert chain from safe content(s)
for (var sci = 0; sci < pkcs12.safeContents.length; ++sci) {
var safeContents = pkcs12.safeContents[sci];
for (var sbi = 0; sbi < safeContents.safeBags.length; ++sbi) {
var safeBag = safeContents.safeBags[sbi];
// this bag has a private key
if (safeBag.type === forge.pki.oids.keyBag) {
//Found plain private key
privateKey = safeBag.key;
} else if (safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) {
// found encrypted private key
privateKey = safeBag.key;
} else if (safeBag.type === forge.pki.oids.certBag) {
// this bag has a certificate...
}
}
}
//function for importingKey
function _importCryptoKeyPkcs8(privateKey, extractable) {
var privateKeyInfoDerBuff = _privateKeyToPkcs8(privateKey);
//import key will not work due to missing reference crypto.subtle
return window.crypto.subtle.importKey(
'pkcs8',
privateKeyInfoDerBuff, {
name: "RSASSA-PKCS1-v1_5",
hash: {
name: "SHA-256"
}
},
extractable, ["sign"]);
}
_importCryptoKeyPkcs8(privateKey, true).
then(function(cryptoKey) {
//sign will not work due to missing reference crypto.subtle
window.crypto.subtle.sign({
name: "RSASSA-PKCS1-v1_5"
},
cryptoKey,
digestToSignBuf)
.then(function(signature2) {
});
});
1 ответ
Предполагается, что SubtleCrypto не определен в небезопасных контекстах. Я думаю, вы использовали протокол http. Переключитесь на https, чтобы решить проблему. Однажды я потратил 4 часа на разработку из-за этого.
Изменить: если SubtleCrypto не определен, и вы вызвали для него какую-то функцию, вы ожидаете, что будет сообщение об ошибке, но не будет никаких ошибок, предупреждений или чего-то еще. Ничего. Это было бы похоже на вызов пустой функции. Настоящая боль при отладке.
У меня также было много проблем с Web Crypto API в приложении Cordova, и я не нашел решения для импорта или сохранения ключей.
Но то, что я нашел вчера, это JS-библиотека:
https://github.com/wwwtyro/cryptico
Может быть, вы можете изменить свой код и использовать его.