【问题标题】:Node.js HTTPS request using Elliptic Curve key使用椭圆曲线键的 Node.js HTTPS 请求
【发布时间】: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 密钥。
  • cat client-key.pemclient-cert.pem。它们是人类可读的并且以熟悉的--- BEGIN ... ----- 开头并以--- END ... ----- 结尾吗?如果是这样,那么它听起来像 OpenSSL 0.9.8 或更低版本。在 1.0.0(或者可能是 1.0.1)中添加了 EC 支持。

标签: javascript node.js https openssl


【解决方案1】:

在正确配置 openssl 1.0.2a 后加载 EC 密钥。确保 Node.js 的 openssl 版本正确。

【讨论】:

  • 听起来您可能有隐藏的 ABI 兼容性问题。 OpenSSL 0.9.8 不支持 EC。 OpenSSL 1.0.0(及更高版本)支持 EC。如果 Node 是针对 0.9.8 构建的,那么您不能交换 1.x 共享对象,因为它们不是二进制兼容的。反之亦然。如果您遇到无法解释的崩溃,请使用 OpenSSL 1.x(如 1.0.2)重建 Node。无法解释的崩溃通常是 ABI 问题的症状。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多