在 Firefox 中从 PEM 导入椭圆曲线私钥
Import elliptic curve private key from PEM in Firefox
我正在尝试从 PEM 编码导入椭圆曲线私钥。以下代码在 Chrome 上运行良好,但不适用于 Firefox。它说:
ERR Operation is not supported
四处浏览,我觉得这是一个已知问题,但我没有找到解决方案。是否有任何解决方法可以在 Firefox 上从 PEM 导入 ECDSA 私钥?我更喜欢使用较旧版本的 Firefoxes 的解决方案。
<html>
<body>
<script>
function stringToArrayBuffer(str) {
var buf = new ArrayBuffer(str.length);
var bufView = new Uint8Array(buf);
var len = str.length;
for (var i=0; i<len; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
};
function importPrivateKey(pem) {
// console.log("PP", pem);
var crypto = window.crypto || window.msCrypto;
// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PRIVATE KEY-----";
const pemFooter = "-----END PRIVATE KEY-----";
const pemContents = pem.substring(pemHeader.length+1, pem.length - pemFooter.length - 2);
// base64 decode the string to get the binary data
const binaryDerString = window.atob(pemContents);
// convert from a binary string to an ArrayBuffer
const binaryDer = stringToArrayBuffer(binaryDerString);
var res = crypto.subtle.importKey("pkcs8", binaryDer, {name: "ECDSA", namedCurve: "P-384"}, true, ["sign"]);
return(res);
}
var promise_key = importPrivateKey("-----BEGIN PRIVATE KEY-----\nMIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDBmb0Yu9UxnUhKN0Cwf\nq/OWVzNTdPKBsUHsVXJAKVUYczDQ7+PYnFxyoVaz8PtoGuihZANiAAQc7WOnfjtL\njDV0+anLxnG2d0p2d7PkdwQBLTu5nONzwOLG0fqeEzbrPRQ125PHQxz7Qr2S4/xz\nC4OVDzebpD/ABnN+QRuiUXf2SMtz90xs80sMLS3glv7OMLCTQLz3P/o=\n-----END PRIVATE KEY-----\n");
promise_key.then(
function(key){
console.log("OK");
},
function(e){
console.log("ERR", e.message);
}
);
</script>
</body>
</html>
我正在回答我自己的问题,以防有人觉得它有用。正如 Michael 所建议的,一种可能的解决方法是使用“jsrsasign”库和 KEYUTIL 函数。安装 jsrsasign 后,以下代码在 Chrome 和 Firefox 上导入 ECDSA 私钥。
<html>
<head>
</head>
<body>
<script type='text/javascript' src='jsrsasign-master/jsrsasign-all-min.js'></script>
<script>
function importPrivateKey(pem) {
var jsrasignkey = KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(pem);
var jwkkey = KEYUTIL.getJWKFromKey(jsrasignkey);
var res = crypto.subtle.importKey("jwk", jwkkey, {name: "ECDSA", namedCurve: "P-384"}, true, ["sign"]);
return(res);
}
var promise_key = importPrivateKey("-----BEGIN PRIVATE KEY-----\nMIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDBmb0Yu9UxnUhKN0Cwf\nq/OWVzNTdPKBsUHsVXJAKVUYczDQ7+PYnFxyoVaz8PtoGuihZANiAAQc7WOnfjtL\njDV0+anLxnG2d0p2d7PkdwQBLTu5nONzwOLG0fqeEzbrPRQ125PHQxz7Qr2S4/xz\nC4OVDzebpD/ABnN+QRuiUXf2SMtz90xs80sMLS3glv7OMLCTQLz3P/o=\n-----END PRIVATE KEY-----\n");
promise_key.then(
function(key){
console.log("OK");
},
function(e){
console.log("ERR", e.message);
}
);
</script>
</body>
</html>
不幸的是,它是 Firefox 的 WebCrypto 引擎中一个长期存在且仍然未解决的错误(请参阅 bugzilla.mozilla.org/show_bug.cgi?id =1133698).
目前共有三种解法:
- 首先:不要使用 Firefox,例如Chrome 或歌剧。
- 第二:使用RAW或JWK编码的密钥。
- 第三:写一个PEM到JWK转换器。
是的,我知道,这三个选项也不会让我开心。
也许你可以使用 JSRSSASIGN (npmjs.com/package/jsrsasign) - 它也支持 ECDSA ?
我正在尝试从 PEM 编码导入椭圆曲线私钥。以下代码在 Chrome 上运行良好,但不适用于 Firefox。它说:
ERR Operation is not supported
四处浏览,我觉得这是一个已知问题,但我没有找到解决方案。是否有任何解决方法可以在 Firefox 上从 PEM 导入 ECDSA 私钥?我更喜欢使用较旧版本的 Firefoxes 的解决方案。
<html>
<body>
<script>
function stringToArrayBuffer(str) {
var buf = new ArrayBuffer(str.length);
var bufView = new Uint8Array(buf);
var len = str.length;
for (var i=0; i<len; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
};
function importPrivateKey(pem) {
// console.log("PP", pem);
var crypto = window.crypto || window.msCrypto;
// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PRIVATE KEY-----";
const pemFooter = "-----END PRIVATE KEY-----";
const pemContents = pem.substring(pemHeader.length+1, pem.length - pemFooter.length - 2);
// base64 decode the string to get the binary data
const binaryDerString = window.atob(pemContents);
// convert from a binary string to an ArrayBuffer
const binaryDer = stringToArrayBuffer(binaryDerString);
var res = crypto.subtle.importKey("pkcs8", binaryDer, {name: "ECDSA", namedCurve: "P-384"}, true, ["sign"]);
return(res);
}
var promise_key = importPrivateKey("-----BEGIN PRIVATE KEY-----\nMIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDBmb0Yu9UxnUhKN0Cwf\nq/OWVzNTdPKBsUHsVXJAKVUYczDQ7+PYnFxyoVaz8PtoGuihZANiAAQc7WOnfjtL\njDV0+anLxnG2d0p2d7PkdwQBLTu5nONzwOLG0fqeEzbrPRQ125PHQxz7Qr2S4/xz\nC4OVDzebpD/ABnN+QRuiUXf2SMtz90xs80sMLS3glv7OMLCTQLz3P/o=\n-----END PRIVATE KEY-----\n");
promise_key.then(
function(key){
console.log("OK");
},
function(e){
console.log("ERR", e.message);
}
);
</script>
</body>
</html>
我正在回答我自己的问题,以防有人觉得它有用。正如 Michael 所建议的,一种可能的解决方法是使用“jsrsasign”库和 KEYUTIL 函数。安装 jsrsasign 后,以下代码在 Chrome 和 Firefox 上导入 ECDSA 私钥。
<html>
<head>
</head>
<body>
<script type='text/javascript' src='jsrsasign-master/jsrsasign-all-min.js'></script>
<script>
function importPrivateKey(pem) {
var jsrasignkey = KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(pem);
var jwkkey = KEYUTIL.getJWKFromKey(jsrasignkey);
var res = crypto.subtle.importKey("jwk", jwkkey, {name: "ECDSA", namedCurve: "P-384"}, true, ["sign"]);
return(res);
}
var promise_key = importPrivateKey("-----BEGIN PRIVATE KEY-----\nMIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDBmb0Yu9UxnUhKN0Cwf\nq/OWVzNTdPKBsUHsVXJAKVUYczDQ7+PYnFxyoVaz8PtoGuihZANiAAQc7WOnfjtL\njDV0+anLxnG2d0p2d7PkdwQBLTu5nONzwOLG0fqeEzbrPRQ125PHQxz7Qr2S4/xz\nC4OVDzebpD/ABnN+QRuiUXf2SMtz90xs80sMLS3glv7OMLCTQLz3P/o=\n-----END PRIVATE KEY-----\n");
promise_key.then(
function(key){
console.log("OK");
},
function(e){
console.log("ERR", e.message);
}
);
</script>
</body>
</html>
不幸的是,它是 Firefox 的 WebCrypto 引擎中一个长期存在且仍然未解决的错误(请参阅 bugzilla.mozilla.org/show_bug.cgi?id =1133698).
目前共有三种解法:
- 首先:不要使用 Firefox,例如Chrome 或歌剧。
- 第二:使用RAW或JWK编码的密钥。
- 第三:写一个PEM到JWK转换器。
是的,我知道,这三个选项也不会让我开心。
也许你可以使用 JSRSSASIGN (npmjs.com/package/jsrsasign) - 它也支持 ECDSA ?