https.Agent 在 Node 中的作用是什么?

not*_*nja 5 ssl https node.js tls1.2

在 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) => {
  // ...
});
Run Code Online (Sandbox Code Playgroud)

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

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

interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions
Run Code Online (Sandbox Code Playgroud)

https.Agent对象的定义是:

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

http.Agent对象的定义是:

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

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

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

Eri*_*ong 10

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

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

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

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

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