我需要以 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
DER 数据本质上是二进制的(字节或技术上的八位字节,而不是字符),但
node-forge
使用 ByteBuffer
类将其存储在专为字符设计的 JS string
中。将 DER 字节视为可在 UTF-8 中编码的字符会产生垃圾。您需要在 string
中使用编码
binary
或
latin1
(别名)来编写此 fs.writeFile*
以获得正确的字节。 (我认为在这种情况下
binary
更清晰,但是nodejs人们认为它是遗留的并且不喜欢它。) OTOH 内置
crypto
使用(也是内置)
Buffer
和 fs.writeFile*
当给定 Buffer
时,忽略编码,因为它知道
Buffer
已经是字节而不是字符。