【发布时间】:2015-06-05 06:54:36
【问题描述】:
我想构建一个连接到需要相互身份验证的 HTTPS 服务器的 HTTPS 客户端。此外,客户端密钥是椭圆曲线密钥而不是 RSA 密钥。为了支持椭圆曲线键,我使用 OpenSSL 1.0.2a 重新编译了 Node.js。
在我的 node.js 程序中,我设置了指定密钥和证书的选项,
var options = {
// These are necessary only if using the client certificate authentication
key: fs.readFileSync('client-key.pem'),
cert: fs.readFileSync('client-cert.pem'),
当我运行它时,我得到了这个错误:
Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
at Error (native)
at Object.createSecureContext (_tls_common.js:110:19)
at Object.exports.connect (_tls_wrap.js:854:21)
at Agent.createConnection (https.js:84:14)
at Agent.createSocket (_http_agent.js:196:16)
at Agent.addRequest (_http_agent.js:168:23)
at new ClientRequest (_http_client.js:156:16)
at Object.exports.request (http.js:51:10)
at exports.request (https.js:138:15)
...
这表明 Node.js 无法读取 EC 密钥。 此错误消息类似于 openssl 尝试将密钥作为 X509 证书读取时:
openssl x509 -text -in sample.key
unable to load certificate
140735234208608:error:0906D06C:PEM routines:PEM_read_bio:no start
line:pem_lib.c:701:Expecting: TRUSTED CERTIFICATE
如何强制 Node.js 将此密钥作为 EC 密钥加载?
【问题讨论】:
-
是的,openssl (v1.0.2a) 正确打印了所有信息。问题在于使用 EC 密钥而不是 RSA 密钥。
-
catclient-key.pem和client-cert.pem。它们是人类可读的并且以熟悉的--- BEGIN ... -----开头并以--- END ... -----结尾吗?如果是这样,那么它听起来像 OpenSSL 0.9.8 或更低版本。在 1.0.0(或者可能是 1.0.1)中添加了 EC 支持。
标签: javascript node.js https openssl