我有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
请求选项(请参阅它们的描述) - 我知道这实际上已被考虑在内,好像字符串格式错误,错误是不同的(并且与证书格式有关) - 正如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 所示