web-dev-qa-db-fra.com

Configurer l'agent https pour autoriser uniquement TLS1.2 pour les demandes sortantes

Je fais des connexions HTTPS à partir d'une application de nœud, en utilisant un certificat client:

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 => { 
    [...]
}); 

Tout fonctionne bien, mais je veux ajouter du code pour garantir que seules les connexions TLS 1.2 sont autorisées. Je ne trouve aucun moyen de configurer cela dans les options https.agent , ou ailleurs. Est-il possible de configurer cela, ou dois-je établir une connexion puis interroger le protocole version, avec quelque chose comme:

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

et abandonner la connexion si le protocole n'est pas satisfaisant?

10
JHH

J'ai d'abord trouvé les documents sur la fabrication demandes HTTPS . Il mentionne que vous pouvez passer des options supplémentaires à tls.connect() qui inclut quelque chose appelé secureProtocol. En fouillant dans tls.connect() , j'ai trouvé l'option secureContext qui mentionne tls.createSecureContext() . Et là, il mentionne enfin secureProtocol qui peut être spécifié avec une chaîne de ne page OpenSSL . J'ai choisi une chaîne qui semblait raisonnable (TLSv1_2_method) et passé l'option secureProtocol directement dans https.request.

Cela imprime SSL Version: TLS 1.2 avec les secureProtocol et SSL Version: TLS 1.1 avec secureProtocol: "TLSv1_1_method". Le gestionnaire d'erreurs à la fin sera appelé si une connexion ne peut pas être établie avec la version TLS donnée.

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