node.js - 使用 ssl 保护来自 Node 的服务调用

标签 node.js security ssl https ssl-certificate

我正在尝试确保从我的 Node 到其他服务的服务调用安全。所有其他服务都启用了 https。我尝试了以下方法

  1. process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'

根据我的理解,它忽略了所有因证书而从代码中删除的错误

  1. 我正在使用 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/

相关文章:

javascript - 使用 Node.js 中的 TLS/SSL 隐式加密连接到 FTP 服务器

security - 发送给用户的出站数据是否也在 SSL 连接中加密?

perl - 在 PERL 中调用 restful web 服务时如何包含 SSL 客户端证书

linux - 如何使 https 可用于 linux 服务器中的客户端

javascript - 无法使用 express.static 提供 json 文件

Node.js、MongoDB - 插入/更新多个文档并发送单个响应

javascript - 如何在 react Bootstrap 表中添加按钮?

javascript - 同源策略 : Why can't JS code make an HTTP request to its domain?

security - 敏感数据的共享点重新身份验证

security - .pem 文件是否同时包含私钥和公钥?