2017-06-19 61 views
4

我從一個節點的應用程序進行HTTPS連接,使用客戶端證書:配置HTTPS代理只允許TLS1.2傳出請求

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'

,如果協議不能令人滿意中止連接?

+0

或者你可以使用nginx作爲反向代理終止您的TLS流量,以便屏蔽來自的NodeJS不必處理HTTPS尚未與外界通信通過https ...移除要求的的NodeJS複雜處理任何相關的TLS至關重要... nginx是配置驅動的,不需要編寫安全邏輯... nginx也可以處理WebSocket –

+0

因此適用於傳出請求。 – JHH

回答

6

首先我找到有關製作HTTPS requests的文檔。它提到你可以將其他選項傳遞給tls.connect(),其中包括secureProtocol。挖掘到tls.connect(),我發現secureContext選項,其中提到tls.createSecureContext()。最後它提到了secureProtocol,它可以用an OpenSSL page的字符串指定。我選擇了一條看似合理的字符串(TLSv1_2_method),並將secureProtocol選項直接傳遞給https.request

這打印SSL Version: TLS 1.2與給定的secureProtocolSSL Version: TLS 1.1secureProtocol: "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() 
+0

明智的答案,這很好。非常有幫助,謝謝! – JHH

+0

添加成功的測試:openssl s_client -connect example.com:443 -tls1 - 應該失敗openssl s_client -connect example.com:443 -tls1_2 should not – phpmydev