调用tls.createSecureContext使用自签证书时遇PEM格式错误求助
解决Node.js加载带密码的自签证书时出现的
ERR_OSSL_PEM_NO_START_LINE错误 问题根源
你用openssl生成的key.pem处于加密状态(生成时设置了密码foobar),但Node.js的tls.createSecureContext默认无法直接解析加密的私钥文件,因此抛出PEM格式解析错误。
解决方案
方案1:加载时直接指定密码
修改代码,在createSecureContext的配置参数中添加passphrase字段,对应生成证书时设置的密码:
var tls = require('tls'); var fs = require('fs'); const [key, cert] = [ fs.readFileSync("key.pem"), fs.readFileSync("cert.pem"), ]; tls.createSecureContext({ key, cert, passphrase: 'foobar' // 新增密码配置 })
方案2:提前解密私钥文件
如果不想在代码中硬编码密码,可以先用openssl将加密的私钥转换为明文格式:
执行以下命令,输入密码foobar完成解密:
openssl rsa -in key.pem -out decrypted-key.pem
之后修改代码加载解密后的明文私钥:
var tls = require('tls'); var fs = require('fs'); const [key, cert] = [ fs.readFileSync("decrypted-key.pem"), // 使用解密后的私钥文件 fs.readFileSync("cert.pem"), ]; tls.createSecureContext({key, cert})
额外排查点
- 检查证书和密钥文件的完整性:打开
cert.pem确认包含-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----,打开key.pem确认包含-----BEGIN ENCRYPTED PRIVATE KEY-----(加密状态)或-----BEGIN RSA PRIVATE KEY-----(明文状态),确保文件没有损坏或内容缺失。 - 不要使用
unix2dos转换文件格式:PEM格式要求使用Unix风格的LF换行符,转换为CRLF格式反而可能触发解析错误,之前的尝试方向有误。
内容的提问来源于stack exchange,提问作者Kurt Peek
相关产品推荐
相关产品推荐

