2015-07-06 9 views
0

Я создаю KeyPair, а затем экспортировать ключ из пары ключей, используя Web Crypto API:WebCrypto: Safari не может exportKey() и обещание, кажется, никогда не разрешить/не

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 } 

Однако на сафари это не удается, печать только:

Exporting from keyPair KeyPair 

И то ничего не делать. Как я могу экспортировать ключ в Safari?

+0

Это на самом деле не имеет ничего общего с обещаниями, но скорее это похоже на ошибку в реализации веб-криптографической Сафари. –

+0

Может быть, доступ к 'keyPair.privateKey' бросает? Вы не поймаете все ошибки в своих обещаниях, попробуйте добавить обработчик '.catch()'. – Bergi

+0

@bergi не будет второй функцией после в 'then()' ловить ошибки? Я прочитал страницу обещаний в MDN, но подозреваю, что не понимаю разницу между .catch() и второй функцией .then(). – mikemaccana

ответ

3

Webkit в настоящее время не может экспортировать ключи как «pkcs8» или «spki» (как указано лично и подтверждено https://bugs.webkit.org/show_bug.cgi?id=129978).

Способ обойти это экспортировать его как «jwk», а затем преобразовать полученный ключ, извлекая различные части и кодируя их в ASN.1. Пример того, как это можно сделать, можно найти в webcrypto-shim project, который вы могли бы просто использовать и не делать сами, хотя он не будет работать для RSA-OAEP + SHA-256 или AES-GCM на Webkit.

0

В настоящее время существует ряд проблем с реализацией Safari WebCrypto, а также с внедрением 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

+0

Это реклама, а не решение. – whiskeyfur

+0

Проблема в том, что Safari не поддерживает формат экспорта, который ему нужен, созданная библиотека добавляет поддержку этого формата экспорта. Это решение указанной проблемы. Если он не хочет использовать это, он может вручную создать формат со второй ссылкой. Это тоже решение. – rmhrisk

+0

Ясность и мои извинения. Я вижу слишком много раз в комментариях рекламодателей, утверждающих, что их исправления в библиотеке «все проблемы», или некоторые из них ... обещают луну и вместо этого дают лишь немного больше денег в свои карманы. Формулировка здесь просто немного приблизилась к этой ерунде/B $. Опять же, мои извинения. – whiskeyfur