如何使用Node.js将DER格式内容转换为PEM格式
Node.js DER转PEM实现方案
Node.js 内置的 crypto 模块原生支持该转换,不需要引入第三方依赖,以下是可直接落地的实现:
实现方式1:内置crypto模块(推荐)
该方案为官方标准实现,自动适配格式校验、加密内容处理等场景,容错性更高。
X509证书转换示例
const crypto = require('crypto'); const fs = require('fs'); // 读取DER格式证书二进制内容 const derCertBuffer = fs.readFileSync('./your-cert.der'); // 导入DER格式证书 const cert = crypto.createX509Certificate(derCertBuffer); // 直接导出PEM格式 const pemCert = cert.toString(); fs.writeFileSync('./output-cert.pem', pemCert);
公钥转换示例
const crypto = require('crypto'); const fs = require('fs'); const derPubKeyBuffer = fs.readFileSync('./your-pubkey.der'); const publicKey = crypto.createPublicKey({ key: derPubKeyBuffer, format: 'der', // 公钥常用格式为spki,若为pkcs1格式可修改为pkcs1 type: 'spki' }); const pemPubKey = publicKey.export({ format: 'pem', type: 'spki' }); fs.writeFileSync('./output-pubkey.pem', pemPubKey);
私钥转换示例
const crypto = require('crypto'); const fs = require('fs'); const derPrivKeyBuffer = fs.readFileSync('./your-privkey.der'); const privateKey = crypto.createPrivateKey({ key: derPrivKeyBuffer, format: 'der', // 私钥常用格式为pkcs8,若为pkcs1格式可修改为pkcs1 type: 'pkcs8', // 若私钥有加密,可补充passphrase字段 // passphrase: 'your-password' }); const pemPrivKey = privateKey.export({ format: 'pem', type: 'pkcs8' }); fs.writeFileSync('./output-privkey.pem', pemPrivKey);
实现方式2:手动编码实现
PEM格式本质是DER二进制内容做Base64编码后,每64个字符换行,再加上对应类型的头尾标记。如果你需要自定义处理逻辑可以用该方案:
const fs = require('fs'); /** * DER转PEM工具方法 * @param {Buffer} derBuffer DER格式二进制内容 * @param {string} label PEM标记类型,可选值:CERTIFICATE / PUBLIC KEY / RSA PRIVATE KEY 等 * @returns {string} PEM格式内容 */ function derToPem(derBuffer, label) { const base64Str = derBuffer.toString('base64'); // 每64字符插入换行 const formattedBase64 = base64Str.match(/.{1,64}/g).join('\n'); return `-----BEGIN ${label}-----\n${formattedBase64}\n-----END ${label}-----\n`; } // 调用示例 const derBuffer = fs.readFileSync('./your-cert.der'); const pemContent = derToPem(derBuffer, 'CERTIFICATE'); fs.writeFileSync('./output.pem', pemContent);
注意事项
- 手动实现时
label参数必须和内容类型完全匹配,否则生成的PEM文件无法被正常识别 - 若处理加密的DER私钥,手动实现需要额外处理解密逻辑,优先使用crypto内置方案
- 所有输入的DER内容必须是Buffer类型的二进制数据,不要传入已经Base64编码的DER字符串
内容的提问来源于stack exchange,提问作者Gnik
相关产品推荐
相关产品推荐

