当前位置: 代码迷 >> JavaScript >> 将 ECDSA PEM 密钥导入浏览器进行签名
  详细解决方案

将 ECDSA PEM 密钥导入浏览器进行签名

热度:49   发布时间:2023-06-13 12:41:31.0

我正在尝试使用导入的 ECDSA 密钥在浏览器中对字符串文字进行签名。 通过粘贴或上传导入我稍后会解决这个问题。 我发现一个库 SubtleCrypto 似乎可以完成这项工作,但是在遵循他们的示例时我遇到了 DOM 异常。

我使用的密钥是 prime256v1 ECDSA 密钥。 这是我根据上的示例使用的代码

const pemEncodedKey = `-----BEGIN EC PRIVATE KEY-----
base64PrivateKeyHere
-----END EC PRIVATE KEY-----`
const pemHeader = "-----BEGIN EC PRIVATE KEY-----";
const pemFooter = "-----END EC PRIVATE KEY-----";
const pemContents = pemEncodedKey.substring(pemHeader.length, pemEncodedKey.length - pemFooter.length);
const binaryDerString = window.atob(pemContents);
const binaryDer = this.str2ab(binaryDerString);

console.log(await window.crypto.subtle.importKey(
  'pkcs8',
  binaryDer,
  {
    name: 'ECDSA',
    namedCurve: 'P-256',
  },
  false,
  [ 'sign' ],
))

我哪里错了?

编辑:添加 str2ab 函数

function str2ab(str) {
  const buf = new ArrayBuffer(str.length);
  const bufView = new Uint8Array(buf);
  for (let i = 0, strLen = str.length; i < strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}

原来我正在导入常规的 PEM 文件。 PKCS8 PEM 文件略有不同,可以通过以下方式进行转换:

openssl pkcs8 -topk8 -nocrypt -in tradfile.pem -out p8file.pem

根据此处的文档

https://wiki.openssl.org/index.php/Command_Line_Elliptic_Curve_Operations