【问题标题】:Cannot read property 'importKey' of undefined, Web Crypto API without ssl无法读取未定义的、没有 ssl 的 Web Crypto API 的属性“importKey”
【发布时间】:2021-07-22 05:45:44
【问题描述】:

我正在使用

window.crypto.subtle.importKey

在本地主机上,它工作正常。但是当我将代码放在服务器上时,它给出了错误 Can not read property importKey of undefined。据我所知,我没有在安全的 https 连接中使用它。因此它显示错误。我在 Chrome 中检查了这个问题 crypto.subtle 的不安全来源 How to enable crypto.subtle for unsecure origins in Chrome?

有没有办法解决这个问题?

这里是代码

        var contents = e.target.result;//Data from the PKCS#12 file input
        var pkcs12Der = arrayBufferToString(contents)
        var pkcs12B64 = forge.util.encode64(pkcs12Der);
        var pkcs12Der = forge.util.decode64(pkcs12B64);
        var pkcs12Asn1 = forge.asn1.fromDer(pkcs12Der);

        var pkcs12 = forge.pkcs12.pkcs12FromAsn1(pkcs12Asn1, false, password);
        var privateKey
        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];
                if (safeBag.type === forge.pki.oids.keyBag) {
                    privateKey = safeBag.key;
                } else if (safeBag.type === forge.pki.oids.pkcs8ShroudedKeyBag) {
                    privateKey = safeBag.key;
                } else if (safeBag.type === forge.pki.oids.certBag) { }
            }
        }
        var privateKeyInfoDerBuff = _privateKeyToPkcs8(privateKey);

        //Import the webcrypto key
        window.crypto.subtle.importKey('pkcs8', privateKeyInfoDerBuff,
            { name: "RSASSA-PKCS1-v1_5", hash: { name: "SHA-256" } }, true, ["sign"])
            .then(function (cryptoKey) {
                var digestToSignBuf = stringToArrayBuffer(message);
                crypto.subtle.sign({ name: "RSASSA-PKCS1-v1_5" }, cryptoKey, digestToSignBuf)
                    .then(function (signature) {
                       // Other code will come here
                    });
            })

【问题讨论】:

  • 你已经问过同样的问题:What is the alternative for window.crypto.subtle.importKey in JavaScript。为什么不编辑旧问题并添加代码?
  • @user9014097 我删除了旧问题。我们可以使用 https,我理解,但在当前情况下我们没有。在这个用例中,安全并不重要。主要问题是运行应用程序。您对实施有任何替代建议吗?
  • 我已经就旧问题给出了我的意见,但不知道如何禁用安全上下文要求。顺便说一句,这里缺少指向 crypto.subtle for unsecure origins in Chrome 的链接。
  • @user9014097 我们可以通过使用 forge 库来解决这个问题,因为我也检查了这个问题。 stackoverflow.com/questions/59519988/web-crypto-api-without-ssl/…
  • 当然您可以使用另一个 JavaScript RSA 库来代替不需要安全上下文的 WebCryptoforge 支持以 PKCS#8 格式 (here) 导入私钥和签名,默认为 PKCS#1 v1.5 (here)。

标签: javascript google-chrome cryptography webcrypto-api


【解决方案1】:

我尝试并得到了解决方案。您可以简单地使用私钥。这里是:

var sha256 = forge.md.sha256.create();
sha256.update(message, 'utf8');
var signature = privateKey.sign(sha256);

var md5 = forge.md.md5.create();
md5.update((signature));

var required_digest = md5.digest().toHex().toUpperCase()

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多