我正在尝试确保从我的 Node 到其他服务的服务调用安全。所有其他服务都启用了 https。我尝试了以下方法
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
根据我的理解,它忽略了所有因证书而从代码中删除的错误
我正在使用
request
模块。我们可以在哪里配置key
- 提供我的私钥文件,cert
- 提供我的证书文件ca
- 证书授权链然后它抛出
UNABLE_TO_VERIFY_LEAF_SIGNATURE
我发现 Node 没有从系统中读取 ca。 它有自己的 ca 链所以我包括了 node-ssl-root-cas 从互联网上获取最新的 cas。
然后使用 ssl-analyser,我发现我的域没有中间 ca 证书
我从我们的 ca 下载了它并制作了一个 ca 链并将其附加到 ssl-root-cas
然后就可以成功发起请求了
但即使我从请求中删除 key 和证书,我也能够发出请求并获得结果。
我如何检查我的请求和响应实际上是否已加密?
或者 Node 只是忽略错误,
最佳答案
仅供引用,如果您不提供自己的“ca”属性,Node 将使用系统上安装的证书授权。当您提供自己的时,将忽略系统的。这是设计使然,因为提供您自己的 CA 可能意味着您希望仅信任由您自己的 CA 签名的证书。如果您不使用自己的 CA,则可以跳过设置“ca”属性。如果是,那么我不确定您为什么还需要提供通常受信任的 CA 的完整列表。这似乎是一个非常奇怪的用例。
您可以使用 https 模块发出请求,而无需提供您自己的 key 和证书。这是预期和记录的行为。由于技术原因,在发出任何 https 请求时,更具体地说,打开任何 TLS 套接字时,客户端还需要有私钥和证书。在默认情况下,服务器不会以任何方式验证客户端,因此浏览器使用通常称为“snakeoil”证书的东西 - 一种捆绑的自签名证书。
在执行 https 请求时提供您自己的 key 和证书的用例是当服务器启用客户端证书检查时。例如,当连接到 Apple 的服务器以向 iOS 发送推送消息时,您拥有 Apple 颁发的客户端证书,Apple 的服务器使用该证书来验证您是否有权发送推送消息(该证书由 Apple 颁发)以及您是哪个应用程序发送到(证书的指纹/校验和)。
除非您访问的 https 服务需要特定的客户端证书,否则您最好不要设置“ key ”和“证书”——没有真正的理由这样做。
因此,总而言之,您可以跳过设置所有三个 key 、证书和 ca,因为真正的问题似乎是您配置错误的服务器(它不为 CA 链提供服务)。
关于node.js - 使用 ssl 保护来自 Node 的服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044183/