首页 > 解决方案 > https.Agent 在 Node 中的作用是什么?

问题描述

在 Node https 模块文档中,关于 https.request,显示了一个示例:

const options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET',
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
options.agent = new https.Agent(options);

const req = https.request(options, (res) => {
  // ...
});

在我看来,这个例子有点模棱两可,我已经问了一个关于这种模棱两可的问题,并在评论重申了奇怪的措辞之后,为此打开了一个问题

无论如何,我仍然试图了解代理在这种情况下所扮演的角色,因为 https.Agent 模块确实接受 TLS 连接选项:

interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions

https.Agent对象的定义是:

HTTPS 的代理对象,类似于 http.Agent。

http.Agent对象的定义是:

代理负责管理 HTTP 客户端的连接持久性和重用。

据此,我了解到代理“负责”管理连接 - 显然,https.Agent 存在于“普通”http.Agent 之上的事实意味着它“负责”管理连接HTTPS 连接 - 因此它可能会收到 TLS 配置选项。

我的问题是——这是否意味着在这种情况下代理有额外的责任来配置请求的网络安全?如果这是真的,这是一个奇怪的 API - 我本来希望在 https.request 的单独密钥上看到网络连接配置(如上面片段后面的示例所示)。为什么要为另一个职责重载同一个对象?真的,为什么有一个 https.Agent 呢?http.Agent 应该控制连接池和保持连接活动,而另一层应该控制配置实际请求。https.Agent 对象对我来说似乎没有明确定义。

标签: node.jssslhttpstls1.2

解决方案


实际上HTTPS 文档指向了一些很好的资源,它还包含一个指向HTTPS 模块源代码的链接,它揭示了很多。但要回答你的问题:

这是否意味着在这种情况下,代理具有配置请求的网络安全性的额外责任

是的,您的 HTTPS 代理可以执行自定义安全功能,甚至可以使用外部 HTTPS 实现,但是对于内置的 https.Agent,使用本机 TLS 模块,并且您传递给构造函数的选项最终传递给tls.connect,允许您可以配置自定义 TLS 选项。

为什么要为另一个职责重载同一个对象?真的,为什么有一个 https.Agent 呢?

因为 HTTPS 在 TLS 上运行。实际上https.Agent在内部调用和构造http.Agent. 额外的位主要是使用 SSL“会话”而不是 TCP“套接字”,如果您在 https.Agent源中搜索getName并将其与http.Agent 的比较,您会发现 SSL 会话缓存基于更多字段,例如DHparams、客户端证书等对于 HTTP 根本不存在的东西。


推荐阅读