配置https代理仅允许TLS1.2用于传出请求

时间:2017-06-19 11:22:31

标签: node.js https tls1.2

我使用客户端证书从节点应用程序建立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选项或其他地方配置它。是否可以配置它,或者我是否必须建立连接,然后query the protocol版本,例如:

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

如果协议不满意则中止连接?

2 个答案:

答案 0 :(得分:17)

首先,我找到了关于制作HTTPS requests的文档。它提到您可以将其他选项传递给tls.connect(),其中包含名为secureProtocol的内容。深入tls.connect(),我找到了提及tls.createSecureContext()secureContext选项。最后提到secureProtocol,可以用an OpenSSL page中的字符串指定。我选择了一个看似合理的字符串(TLSv1_2_method)并将secureProtocol选项直接传递到https.request

这会将SSL Version: TLS 1.2打印为给定的secureProtocol,将SSL Version: TLS 1.1打印为secureProtocol: "TLSv1_1_method"。如果无法使用给定的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()

答案 1 :(得分:2)

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

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 docs: tls_tls_createsecurecontext_options