错误:导入“pem”密钥时没有密钥导入程序

Posted

技术标签:

【中文标题】错误:导入“pem”密钥时没有密钥导入程序【英文标题】:Error: no importer for key when importing "pem" key 【发布时间】:2021-06-23 17:26:40 【问题描述】:

应用程序按照node-jose 2.0.0 上的说明导入.pem 密钥。这是文档:

To import and existing Key from a PEM or DER:

// input is either a:
// *  String serialization of a JSON JWK/(base64-encoded) PEM/(binary-encoded) DER
// *  Buffer of a JSON JWK/(base64-encoded) PEM/(binary-encoded) DER
// form is either a:
// * "json" for a JSON stringified JWK
// * "private" for a DER encoded 'raw' private key
// * "pkcs8" for a DER encoded (unencrypted!) PKCS8 private key
// * "public" for a DER encoded SPKI public key (alternate to 'spki')
// * "spki" for a DER encoded SPKI public key
// * "pkix" for a DER encoded PKIX X.509 certificate
// * "x509" for a DER encoded PKIX X.509 certificate
// * "pem" for a PEM encoded of PKCS8 / SPKI / PKIX  //<<=="pem"
keystore.add(input, form).
        then(function(result) 
          // result is a jose.JWK.Key
        );

密钥已经以.pem 形式生成,其内容存储在nodejs 配置文件中,如下变量process.env.josePrivateKey

-----BEGIN PRIVATE KEY-----
NC4CAQAwBQYcK2VwBCIEIIWUb0/MoKaBxQkmmPlHIGyPfDQb/U3D6jQ+gMUGtvpa
-----END PRIVATE KEY-----

以下是将pem 密钥添加到密钥库的代码:

const jose = require('node-jose');
let keystore = jose.JWK.createKeyStore();
let privkey = await keystore.add(process.env.josePrivateKey, "pem"); //<<==this code throws error

但是有一个错误:

(node:11572) UnhandledPromiseRejectionWarning: Error: no importer for key
    at JWKStore.value (C:\d\code\js\xyz\node_modules\node-jose\lib\jwk\keystore.js:305:21)
    at initKeystore (C:\d\code\js\xyz\startup\accessstorageinfo.js:9:34)  //<<==code as above
    at Object.<anonymous> (C:\d\code\js\xyz\startup\accessstorageinfo.js:14:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (C:\d\code\js\xyz\server.js:13:1)

密钥导入这里缺少什么?

【问题讨论】:

【参考方案1】:

(截至 2021 年 3 月)node-jose 不支持以下密钥:Ed25519、Ed448、X25519 或 X448。它也不支持secp256k1 EC 曲线。对于其中任何一个,它将返回您遇到的错误。因此它不支持 JWS 算法 EdDSAES256K

另一方面,https://github.com/panva/jose 在 Node.js 运行时支持以上所有内容。

【讨论】:

难怪我在源码中没有找到key type。非常感谢。

以上是关于错误:导入“pem”密钥时没有密钥导入程序的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins无法导入以下密钥文件

如何将 OpenSSL 密钥文件导入 Windows 证书存储

keytool :证书导入给出错误消息 - 密钥库被篡改,或密码不正确

Java 密钥库可以导入 OpenSSL 生成的密钥对吗?

从 PEM 导入 JWK 时如何覆盖自动计算的孩子

收到“警告:未受保护的私钥文件!”尝试导入 SSH 密钥时出现错误消息 [关闭]