我正在尝试导入私钥以在 NodeJS 中签署 XML 文件。 为了签署 XML,我使用 xmldsigjs,它要求将密钥传递到由
CryptoKey
获取的 crypto.subtle.importKey
对象中。
根据我的理解,importKey
采用 DER 格式的密钥。
我使用以下命令生成了密钥和证书:
openssl req -newkey rsa-pss -new -nodes -x509 -days 3650 -pkeyopt rsa_keygen_bits:4096 -sigopt rsa_pss_saltlen:32 -keyout key.pem -out cert.pem
这将创建一个 pkcs8 格式的私钥。当使用此命令生成的任何私钥时,我收到此错误
DataError: Invalid key type
。
这是用于导入密钥的代码。
const privateKey = await fs.readFile(path.join(__dirname, 'certificates', 'key.pem'), 'utf-8');
const pemHeader = '-----BEGIN PRIVATE KEY-----';
const pemFooter = '-----END PRIVATE KEY-----';
const pemContents = privateKey.substring(pemHeader.length, privateKey.length - pemFooter.length - 1);
const key = await crypto.subtle.importKey(
'pkcs8',
Buffer.from(pemContents, 'base64'),
{ name: 'RSA-PSS', hash: { name: 'SHA-256' } },
false,
['sign'],
);
当使用我使用在线工具此处创建的另一个密钥时,密钥导入工作正常。 API 规范文档提供了生成密钥的命令。
会不会是我生成密钥的方式错误?
您的库似乎不支持 PKCS#1 v2.1 密钥格式。您应该回退到 PKCS#1 v1.5 格式,如下所示:
openssl req -newkey rsa:4096 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem