如何从 --capath 获取密钥和证书

Posted

技术标签:

【中文标题】如何从 --capath 获取密钥和证书【英文标题】:How do I get key and cert from --capath 【发布时间】:2021-10-24 22:34:44 【问题描述】:

使用 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 绝对不会。 【参考方案1】:

只需使用 openssl 支持重建 node.js。所以现在我使用与 curl 相同的库。 谢谢大家

【讨论】:

以上是关于如何从 --capath 获取密钥和证书的主要内容,如果未能解决你的问题,请参考以下文章

如何获取和备份 SSL 证书

Expo如何获取自动生成的ios证书?

Https获取服务器证书

如何从证书文件本身(.p12)确定 SSL 证书到期日期

如何从自签名证书的密钥库中导出私钥

从密钥保险库将证书上载到App Service