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

问题描述 投票:0回答:1

在 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 配置选项。

我的问题是 - 这是否意味着在这种情况下

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

node.js ssl https tls1.2
1个回答
10
投票

实际上 HTTPS doc 指向一些很好的资源,它还包含指向 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 根本不存在的东西。

© www.soinside.com 2019 - 2024. All rights reserved.