【发布时间】:2023-03-30 05:10:01
【问题描述】:
使用 OpenSSL 并添加 CA,curl -X GET https://someserver.com -I --capath /etc/ssl/certs/ 工作正常。 curl -X GET https://someserver.com -I --cacert /etc/ssl/certs/someserver.pem 也可以。
我想用 node.js https.request() 进行同样的调用
我已尝试将 SSL_CERT_DIR 设置为 /etc/ssl/certs/ 的 node --use-openssl-ca app.js - 没有帮助。
试过了:
const https = require('https');
const fs = require('fs');
const options = {
hostname: 'someserver.com',
port: 443,
path: '/',
method: 'GET',
ca: fs.readFileSync('/etc/ssl/certs/someserver.pem')
}
const req = https.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.end()
错误:写入 EPROTO 140249139050368:error:14094410:SSL 例程:ssl3_read_bytes:sslv3 警报握手失败:../deps/openssl/openssl/ssl/record/rec_layer_s3.c:1544:SSL 警报号 40
谢谢。
【问题讨论】:
-
警报 40 不是由于证书验证;甚至可能还没有收到证书。最好的方法是检查服务器日志以查看它认为问题所在。或尝试命令行
openssl s_client -connect host:443,如果OpenSSL 版本低于1.1.1 添加-servername host;如果这也失败了,最好使用wireshark获取网络跟踪并寻找差异。 -
什么键?那些
curl命令不返回键。只有证书。 -
当然 curl 不会返回密钥,但是 CA 是有效的,因为 curl 可以完美运行。为 nodejs 指定相同的 cacert 没有帮助。
-
@dave_thompson_085 openssl s_client -connect someserver.com:443 CONNECTED(00000003)
-
这太不可思议了;
s_client没有-quiet应该输出 lots 的信息,除非服务器挂起,你知道这个不会。但是尝试添加-debug使其更加嘈杂。哦,还有一件事(哥伦布的阴影):你有任何代理设置吗? curl 会使用它们,但我认为 nodejs 不会,而 openssl 绝对不会。
标签: node.js security https openssl ssl-certificate