Node.js:如何将HTTPS请求发送到使用自签名证书的应用

时间:2019-11-26 18:43:39

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

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

但是就目前而言,我无法让一个应用程序通过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 /中复制证书文件(调用应用程序操作系统为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

所示。

1 个答案:

答案 0 :(得分:0)

可以将此选项设置为通过额外的证书

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

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

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

希望这会有所帮助。