【问题标题】:Node.js: how to send HTTPS requests to an app which uses a self-signed certificateNode.js:如何将 HTTPS 请求发送到使用自签名证书的应用程序
【发布时间】:2020-03-22 06:15:34
【问题描述】:

我有 2 个可通过 HTTPS 访问的 Node.js 应用程序。我目前正在为这些服务使用自签名证书。对这些服务的手动访问(通过浏览器或 Postman)按预期工作(带有关于自签名证书的通常安全警告等)。

但就目前而言,我不能让一个应用程序通过 HTTPS 与另一个应用程序通信。这是我当前的代码:

// Request parameters and options
const https = require('https');
const postData = JSON.stringify(myPostData);
const options = {
  hostname: '...',
  port: ...,
  path: '...',
  method: 'POST',
  headers: {
      'Content-Type': 'application/json',
      'Content-Length': postData.length,
  },
  rejectUnauthorized: false,
};
let str = '';
const req = https.request(options, (res) => {
  // Assembling response data...
  res.on('data', chunk => str += chunk );
  res.on('end', () => {
    console.log('Received:', str);
  });
});
// Error handling
req.on('error', (e) => {
  console.error(e);
});
// Sending payload and terminating
req.write(postData);
req.end();

问题

这行得通,但只是因为我使用了rejectUnauthorized: false

我怎样才能避免使用这个选项?我看到我可以提供一个cert 选项(在https.RequestOptions 中),但我不确定如何使用它。当我创建自签名证书时,我拥有它的每一部分。

我的证书文件,名为 selfsigned.crt,看起来像这样(并且有 Unix EOL):

-----BEGIN CERTIFICATE-----
MFoXDTI0MTEyNTE3NTczMFowgYcxCzAJBgNVBAYTAkZSMQ0wCwYDVQQIDARQQUNB
QGNlbmVhdS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCrP3Hy
........... lots of lines ......................................
zI2hWprwsM3PGb0DLCqlotqdoxu59PQRC7aj/yb11HyfyYO9hvFmjGPkmN6T0+r6
VQQGEwJGUjENMAs/Qs7p+B9/+taee8iPWpk=
-----END CERTIFICATE-----

我已经尝试了这些解决方案:

  • 将证书字符串指示为ca 和/或cert 请求选项(请参阅他们的description) - 我知道这实际上已被考虑在内,好像字符串格式错误,错误是不同的(和与证书格式有关)
  • 根据Ashish Modi 的建议将证书的路径指向“NODE_EXTRA_CA_CERTS”环境变量)
  • 复制/etc/ssl/certs/中的cert文件(调用应用操作系统是debian)并启动update-ca-certificates

所有这些解决方案都不会改变结果:

code: DEPTH_ZERO_SELF_SIGNED_CERT
Error: self signed certificate
      at TLSSocket.onConnectSecure (_tls_wrap.js:1055:34)

至于现在,我还没有一个可行的解决方案。

额外问题!我很惊讶一个简单的调用看起来如此混乱,所有的时间顺序都颠倒了它与回调。有没有更简洁的方式来进行 HTTPS 调用? => request-promise 可能是一个选项,如 jfriend00

所示

【问题讨论】:

  • 是否有更简洁的方式来进行 HTTPS 调用? - 是的,使用带有 promise 的 request-promise 库。如果你愿意,你甚至可以使用 async/await 和 promise。 https.request() 带有简单的回调就像是在你拥有更高级别且更易于使用的选项时进入裸机。
  • 太快了! = ) 这个库听起来确实很有希望,谢谢!我会去的。不过,我也必须用这个设置我的证书,但似乎可以使用相同的代理选项,所以一旦我知道如何......
  • 是的,关于 cert 的东西,我自己并不确切知道该怎么做,但从概念上讲,您想教本地客户端信任您的自签名 CA。我很好奇一个人是如何做到这一点的,所以我正在跟踪这个问题,希望其他人能告诉你方法。
  • 我很惊讶我如何努力寻找有关如何处理自签名证书的文档。在内部(内部服务之间)使用它时,我认为这样做并不少见。
  • 也许可以看到标题下的代码in this article:“定义 https 请求程序”。您可以在其中指定 CA 作为请求的一部分。

标签: node.js post https self-signed-certificate


【解决方案1】:

这个选项可以设置通过额外的证书

process.env["NODE_EXTRA_CA_CERTS"] = "some/path/to/ssl.crt"

此选项可以完全禁用 ssl 错误(不推荐)

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

希望这会有所帮助。

【讨论】:

  • 感谢您的建议!不幸的是,它在我的情况下不起作用。我编辑了我的问题以反映我目前的调查状态。
猜你喜欢
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2013-01-05
相关资源
最近更新 更多