节点中的HTTPS代理的角色是什么? [英] What is the role of https.Agent in Node?
问题描述
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) => {
// ...
});
在我看来,这个例子有点模棱两可,我问了一个SO question regarding this ambiguity,在一个重申奇怪措辞的评论后面,opened an issue for this。
无论如何,我仍在努力理解代理在此场景中扮演的角色,因为HTTPS。代理模块确实接受TLS连接选项:
interface AgentOptions extends http.AgentOptions, tls.ConnectionOptions
https.Agent对象的定义为:
与HTTPS类似的HTTPS代理对象。
http.Agent对象的定义为:
代理负责管理HTTP客户端的连接持久性和重复使用。
由此我了解到,代理负责管理连接--很明显,HTTPS代理位于普通的Http之上。代理的存在意味着它负责管理HTTPS连接--因此它可能会收到TLS配置选项。
我的问题是-这是否意味着代理在这种情况下需要额外负责配置请求的网络安全?如果这是真的,那么这就是一个奇怪的API--我本以为会在一个单独的关键字上看到网络连接配置,以用于HTTPS请求(如上面代码片断之后的示例所示)。为什么要为另一个责任重载同一对象呢?真的吗,为什么要有HTTPS代理呢?代理应该控制连接池和保持连接处于活动状态,而另一层应该控制实际请求的配置。在我看来,Https.Agent对象定义不明确。推荐答案
实际上HTTPS doc指向一些好的资源,它还包含一个指向HTTPS module source code的链接,这揭示了很多东西。但要回答您的问题:
这是否意味着代理在这种情况下需要额外负责配置请求的网络安全
在某种程度上,您的HTTPS代理可以执行自定义安全功能,甚至可以使用外部HTTPS实现,但对于内置的HTTPS代理,使用原生TLS模块,您传递给构造函数的选项是ultimately passed to tls.connect
,允许您配置自定义TLS选项。
为什么要为另一个职责重载同一对象?说真的,为什么要有HTTPS代理?
因为HTTPS在TLS上运行。实际上https.Agent
内部调用并使用http.Agent
构造。额外的部分主要是在TCP套接字和套接字上使用SSLSession;,如果您搜索getName in https.Agent源代码并将其与http.Agent's进行比较,您会发现SSL会话缓存基于更多的字段,如动态主机参数、客户端证书等,这些都是HTTP根本不存在的。
这篇关于节点中的HTTPS代理的角色是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!