node-forge 最初是一个 JavaScript TLS 实现,如今主要用于它的 PKI 部分:生成和解析 X.509 证书与 CSR、读写 PKCS#12 包、RSA 加密和签名,以及 ASN.1 解析器。它在浏览器和 Node.js 中的行为相同,不含原生代码。
除 Ed25519 之外,它不支持任何椭圆曲线。forge.pki 只提供 rsa 和 ed25519,检查也证实了由此带来的后果:对 ECDSA 证书调用 certificateFromPem() 会抛出 Cannot read public key. OID is not RSA.,对 EC 公钥调用 publicKeyFromPem() 会抛出 Cannot read public key. Unknown OID.——尽管同样的字节用 forge 自己的 ASN.1 读取器可以正常解析。检查真实环境中证书的代码随时都会遇到 ECDSA 密钥,需要另一个解析器来处理它们;node:crypto 的 X509Certificate 或证书解码器都能处理这两种密钥类型。
对于 RSA,只要参数一致,它就能顺利互通。forge 生成的 PKCS#1 v1.5 和 PSS 签名能用 node:crypto 验证通过;PSS 要求两端的摘要算法、MGF1 摘要算法和盐长度一致,forge 要求你像示例那样明确指定这三项。公钥可以从 SPKI、PKCS#1 和证书 PEM 加载,私钥可以从 PKCS#8、加密的 PKCS#8、PKCS#1 和 PKCS#12 加载——在 PFX 查看器中打开这些包即可查看其中的内容。
对于同一个种子,forge 生成的 Ed25519 签名与 node:crypto 生成的逐字节相同。它的私钥是 64 字节的扩展形式——种子后接公钥——因此要求 32 字节种子的库只需要前一半。
签名验证历来存在解析过于宽松的问题,其中一例至今尚未修复。2026年9月发布的安全公告 GHSA-86w9-cpqp-85rv(CVE-2026-85393)尚无修复版本,它指出 1.4.0 及以下版本的 RSA PKCS#1 v1.5 验证会忽略 DigestInfo 算法标识符中的多余元素,使得在公钥指数较小(例如 3)的密钥下可以伪造签名。检查复现了这种宽松行为:在该位置带有多余元素、填充正确的数据块在 forge 中验证通过,而被 node:crypto 拒绝。在修复版本发布之前,应使用 node:crypto 或 WebCrypto 验证 PKCS#1 v1.5 签名,并避免使用指数为 3 的 RSA 密钥。1.4.0 本身修复了上一轮问题——摘要之后的多余字段和非规范的 Ed25519 签名都会被拒绝——而 1.3.0 之前的版本还存在更早的签名伪造漏洞(CVE-2022-24771、CVE-2022-24772)。