WebCrypto:Safari 无法导出密钥()并且承诺似乎永远不会 resolve/fail
WebCrypto: Safari cannot exportKey() and promise seems to never resolve/fail
我正在创建一个密钥对,然后使用 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 上导出密钥?
Webkit 目前无法将密钥导出为 'pkcs8' 或 'spki'(亲自发现并由 https://bugs.webkit.org/show_bug.cgi?id=129978 确认)。
解决此问题的方法是将其导出为 'jwk',然后通过提取各个部分并在 ASN.1 中对其进行编码来转换生成的密钥。在 webcrypto-shim project 中可以找到如何完成此操作的示例,您可以直接使用它而不必自己做,尽管它不适用于 RSA-OAEP + SHA-256 或 AES-GCM on Webkit.
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
我正在创建一个密钥对,然后使用 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 上导出密钥?
Webkit 目前无法将密钥导出为 'pkcs8' 或 'spki'(亲自发现并由 https://bugs.webkit.org/show_bug.cgi?id=129978 确认)。
解决此问题的方法是将其导出为 'jwk',然后通过提取各个部分并在 ASN.1 中对其进行编码来转换生成的密钥。在 webcrypto-shim project 中可以找到如何完成此操作的示例,您可以直接使用它而不必自己做,尽管它不适用于 RSA-OAEP + SHA-256 或 AES-GCM on Webkit.
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