web-dev-qa-db-ja.com

送信要求に対してTLS1.2のみを許可するようにhttpsエージェントを構成します

クライアント証明書を使用して、ノードアプリから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'

プロトコルが満足できない場合、接続を中止しますか?

10
JHH

最初に HTTPSリクエスト の作成に関するドキュメントを見つけました。 secureProtocolと呼ばれるものを含む追加オプションをtls.connect()に渡すことができると述べています。 tls.connect() を掘り下げて、 tls.createSecureContext() に言及するsecureContextオプションを見つけました。そして最後に、 OpenSSLページ の文字列で指定できるsecureProtocolに言及しています。妥当と思われる文字列(TLSv1_2_method)を選択し、secureProtocolオプションをhttps.requestに直接渡しました。

これは、指定されたsecureProtocolSSL Version: TLS 1.2SSL 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()
20
supersam654