node-forge:将 DER 编码证书保存到文件中

问题描述 投票:0回答:1

我需要以 PEM 和 DER 编码保存证书。
PEM 不是问题:

const cert = forge.pki.createCertificate();
// (...)
// (...)
// cert.sign(...);
const pemCert = forge.pki.certificateToPem(cert);
fs.writeFileSync('cert.pem', pemCert, {encoding: 'utf-8'});
// ^ GOOD

另一方面,DER,我不知道如何将正确的证书保存到文件中。

我希望以下 JS 代码与
的输出相匹配

openssl x509 -outform der -in ./cert.pem -out ./cert_good.cer
,
然而事实并非如此,我得到了一些不同的东西,显然是“格式错误”:

const derCert = forge.pki.pemToDer(pemCert).getBytes();
fs.writeFileSync('cert_bad.cer', derCert, {encoding: 'utf-8'});

当我说“畸形”时,我指的是这样一个事实:

openssl x509 -inform der -in cert_bad.cer -text -noout
返回: 无法从 cert_bad.cer 找到证书

我做错了什么?

编辑
我想出了另一种方法来解决这个问题,使用 Node.js Crypto moudule -> class X509Certificate -> property raw.
然而,关于节点伪造的问题仍然存在。无论如何:

import { X509Certificate } from 'crypto'

const cert = forge.pki.createCertificate();
// (...)
// (...)
// cert.sign(...);
const pemCert = forge.pki.certificateToPem(cert);
fs.writeFileSync('cert.pem', pemCert, {encoding: 'utf-8'});
// ^ GOOD

const x509 = new X509Certificate(pemCert);
const derCert = x509.raw;
fs.writeFileSync('cert_good.cer', derCert, {encoding: 'utf-8'});
// ^ NOW ALSO GOOD
node.js ssl-certificate pki der node-forge
1个回答
0
投票

DER 数据本质上是二进制的(字节或技术上的八位字节,而不是字符),但

node-forge
使用
ByteBuffer
类将其存储在专为字符设计的 JS
string
中。将 DER 字节视为可在 UTF-8 中编码的字符会产生垃圾。您需要在 string
 中使用编码 
binary
latin1
(别名)来编写此 
fs.writeFile*
 以获得正确的字节。 (我认为在这种情况下
binary
更清晰
,但是nodejs人们认为它是遗留的并且不喜欢它。) OTOH 内置

crypto

使用(也是内置)

Buffer
fs.writeFile*
当给定
Buffer
时,
忽略
编码,因为它知道 Buffer 已经是字节而不是字符。
    

© www.soinside.com 2019 - 2024. All rights reserved.