配置https代理以允许仅使用TLS1.2进行出站请求

16

我正在使用客户端证书从 Node 应用程序建立 HTTPS 连接:

var options = { 
    hostname: 'https://my-server.com', 
    port: 443, 
    path: '/', 
    method: 'GET', 
    key: fs.readFileSync('client1-key.pem'), 
    cert: fs.readFileSync('client1-crt.pem'), 
    ca: fs.readFileSync('ca-crt.pem') }; 

var req = https.request(options, res => { 
    [...]
}); 

一切都运行正常,但我想添加代码以确保仅允许TLS 1.2连接。我找不到在https.agent选项或其他地方配置此项的方法。是否可以配置此项,还是必须建立连接,然后使用以下内容之类的查询协议版本:

res.socket.getProtocol() === 'TLSv1.2'

如果协议不符合要求,则中止连接?


你可以选择使用nginx作为反向代理来终止TLS流量,从而使nodejs无需处理https,但仍然可以通过https与外部世界通信...完全消除了要求nodejs处理任何TLS相关事项的复杂性...nginx是基于配置的,无需编写安全逻辑...nginx还处理WebSockets。 - Scott Stensland
这是用于发出请求的。 - JHH
这个回答解决了你的问题吗?如何在 `node-fetch` 中使用特定的TLS版本,比如TLS v1.2? - undefined
3个回答

32

首先我找到了有关制作HTTPS请求的文档。它提到您可以向tls.connect()传递其他选项,其中包括称为secureProtocol的东西。深入挖掘tls.connect(),我找到了secureContext选项,它提到tls.createSecureContext()。最后,在那里它终于提到了secureProtocol,它可以用来指定OpenSSL页面中的字符串。我选择了一个看起来合理的字符串(TLSv1_2_method)并将secureProtocol选项直接传递给https.request

这将使用给定的secureProtocol打印SSL版本:TLS 1.2,并使用secureProtocol:“TLSv1_1_method”打印SSL版本:TLS 1.1。如果无法使用给定的TLS版本建立连接,则会调用末尾的错误处理程序。

var https = require('https')

var options = {
    hostname: 'www.howsmyssl.com',
    port: 443,
    path: '/a/check',
    method: 'GET',
    secureProtocol: "TLSv1_2_method"
}

https.request(options, res => {
  let body = ''
  res.on('data', d => body += d)
  res.on('end', () => {
    data = JSON.parse(body)
    console.log('SSL Version: ' + data.tls_version)
  })
}).on('error', err => {
  // This gets called if a connection cannot be established.
  console.warn(err)
}).end()

非常棒的答案,这个方法很有效。真的很有帮助,谢谢! - JHH
添加成功的测试:openssl s_client -connect example.com:443 -tls1 - 应该失败,openssl s_client -connect example.com:443 -tls1_2 不应该失败。 - richardwhitney
@supersam654,链接openssl链接已经失效。可能新的链接是http://openssl.cs.utah.edu/docs/ssl/ssl.html#dealing_with_protocol_methods。 - coding_idiot
你弄清楚如何使用HTTPs代理来完成这个任务了吗? - atymic
节点使用的默认值是什么? - TemporaryFix
显示剩余2条评论

9

关于此解决方案的最新更新,几年已经过去,一些事情已经改变。

现在 Node 文档推荐使用 minVersionmaxVersion 代替 secureProtocol,因为后者已成为选择 TLS 协议版本的旧机制,所以您可以通过使用 minVersion: "TLSv1.2" 来获得相同的结果:

var https = require('https')

var options = {
    hostname: 'www.howsmyssl.com',
    port: 443,
    path: '/a/check',
    method: 'GET',
    minVersion: "TLSv1.2",
    maxVersion: "TLSv1.2"
}
...

参考文献:Node文档:tls_tls_createsecurecontext_options


0
你可以使用 tls 库:
const tls = require('tls');

tls.DEFAULT_MIN_VERSION = 'TLSv1.2';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接