1

我正在创建一个密钥对,然后使用 Web Crypto API 从密钥对导出一个密钥:

var log = console.log.bind(console);

var subtleCrypto = null;
if ( window.crypto ) {
    subtleCrypto = window.crypto.subtle || window.crypto.webkitSubtle;
}
if ( window.msCrypto ) {
    subtleCrypto = window.msCrypto.subtle
}

subtleCrypto.generateKey(
    {
        name: "RSASSA-PKCS1-v1_5",
        modulusLength: 2048,
        publicExponent: new Uint8Array([1, 0, 1]),  // 24 bit representation of 65537
        hash: {name: "SHA-256"}
    },
    true, // can extract it later if we want
    ["sign", "verify"]
).then(function(keyPair){
    log('Exporting from keyPair', keyPair)
    subtleCrypto.exportKey('pkcs8', keyPair.privateKey).then(function(pkcs8) {
        log('Exported keypair!', pkcs8)
    }, function(reason) {
        log('Couldnt export keypair', reason)
    })
}, function(reason){
    log('could not generate key', reason)
})

在 Chrome 和 Firefox 上,代码运行良好,打印:

 "Exporting from keyPair" Object { privateKey: CryptoKey, publicKey: CryptoKey }
 "Exported keypair!" ArrayBuffer { byteLength: 1218 }

但是在 Safari 上它失败了,只打印:

 Exporting from keyPair KeyPair 

然后什么都不做。如何在 Safari 上导出密钥?

4

2 回答 2

3

Webkit 目前无法将密钥导出为“pkcs8”或“spki”(个人发现并由https://bugs.webkit.org/show_bug.cgi?id=129978确认)。

解决此问题的方法是将其导出为“jwk”,然后通过提取各个部分并将其编码为 ASN.1 来转换生成的密钥。可以在webcrypto-shim 项目中找到如何完成此操作的示例,您可以使用它而不必自己动手,但它不适用于 Webkit 上的 RSA-OAEP + SHA-256 或 AES-GCM .

于 2015-11-21T14:20:37.517 回答
0

目前 WebCrypto 的 Safari 实现以及 Edge 实现存在许多问题。

出于这个原因,我们实现了这个库来掩盖这些差异,你可以在这里找到它:https ://github.com/PeculiarVentures/webcrypto-liner/blob/master/BrowserSupport.md

在这种特殊情况下,如较早的响应所述,Safari 不实现 PKCS8 格式。

如果您需要 PKCS8 格式,请查看此功能:https ://github.com/PeculiarVentures/pkijs-es6/blob/62bbedea4cd3b60debbdc309bc48b5c188f4504e/src/CryptoEngine.js#L438-L532

于 2016-12-09T07:14:58.130 回答