首页 > 解决方案 > 如何使用 CNG 密钥使用 JwtSecurityTokenHandler 签名的 Nodejs 工具使用 ES384 算法验证 JWT 令牌

问题描述

我正在尝试使用 CNG 生成的密钥使用JwtSecurityTokenHandler签名的 Node.js 工具验证 JWT 令牌

我尝试了许多 Nood.js 工具,例如jsonwebtoken

jwt.verify(token, publickey,{ algorithms: ['ES384'], ...

但是每次都会出现错误的标签错误

["error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error"],"library":"asn1 encoding routines","function":"asn1_check_tlen","reason":"wrong tag","code":"ERR_OSSL_ASN1_WRONG_TAG"

CNG 生成的公钥和私钥

 var key = CngKey.Create(CngAlgorithm.ECDsaP384, "keyName",
                new CngKeyCreationParameters
                {
                    KeyCreationOptions = CngKeyCreationOptions.OverwriteExistingKey,
                    KeyUsage = CngKeyUsages.AllUsages,
                    ExportPolicy = CngExportPolicies.AllowPlaintextExport,
                });

            txtPrivateKey = Convert.ToBase64String(key.Export(CngKeyBlobFormat.EccPrivateBlob));
            txtPublicKey = Convert.ToBase64String(key.Export(CngKeyBlobFormat.EccPublicBlob));

我尝试转换密钥,但仍然遇到相同的异常。如何使用 CNG 和 ES384 算法为 Node.js 工具生成有效的公钥?

标签: node.jsjwtcng

解决方案


看来我找到了解决方案:

  1. 以pkcs8格式导出私钥

Convert.ToBase64String(key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob));

  1. 保存到 pem 并添加 BEGIN/END PRIVATE KEY
  2. 使用 openssl 生成公钥

openssl ec -in pkcs8.pem -pubout -out pkcs8genpubkey.pem


推荐阅读