我有 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)-我知道实际上已经考虑到了这一点,就好像该字符串格式错误,错误是不同的(并且与证书格式有关)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
答案 0 :(得分:0)
可以将此选项设置为通过额外的证书
process.env["NODE_EXTRA_CA_CERTS"] = "some/path/to/ssl.crt"
此选项可以完全禁用ssl错误(不推荐)
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;
希望这会有所帮助。