Как установить requestCert и rejectUnauthorized для каждого хоста? - PullRequest
0 голосов
/ 17 октября 2019

У меня есть следующий рабочий код:

const secure_contexts =
  { 'foo.example.com': tls.createSecureContext
    ( { key: fs.readFileSync('/srv/ssl/keys-example.com/_.example.com.key')
      , cert: fs.readFileSync('/srv/ssl/keys-example.com/_.example.com-ours-then-theirs.cer')
      }
    )
  , 'ws.foo.example.com': tls.createSecureContext
    ( { key: fs.readFileSync('/srv/ca/server_ca/private/ws.foo.example.com.key.pem')
      , cert: fs.readFileSync('/srv/ca/server_ca/certs/ws.foo.example.com.cert.pem')
      , ca: [ fs.readFileSync('/srv/ca/client_ca/certs/ca-chain.cert.pem') ]
      , passphrase: 'secret'
      }
    )
  }
  ;

const opts =
  { key: fs.readFileSync('/srv/ssl/keys-example.com/_.example.com.key')
  , cert: fs.readFileSync('/srv/ssl/keys-example.com/_.example.com-ours-then-theirs.cer')
  // FIXME: it is less than ideal that requestCert and rejectUnauthorized cannot be specified in the TLS Secure Contexts
  , requestCert: true
  , rejectUnauthorized: false
  , SNICallback: function (domain, callback) {
      console.log("sni:", domain);
      if (secure_contexts[domain]) {
        console.log("sni:", domain, "found");
        callback(null, secure_contexts[domain]);
      }
    }
  }
  ;

console.log("creating https_server");
const https_server = https.createServer(opts, app)

В настоящее время это разрешает соединения с обоими полными доменными именами без сертификата клиента.

Требуется поведение, разрешающее подключения к foo.example.com без сертификата клиента, но соединения с ws.foo.example.com следует разорвать, если они не предоставляют сертификат клиента.

Я попытался переместить свойства requestCert и rejectUnauthorized в secure_contexts /ws.foo.example.com (и изменение rejectUnauthorized на true), но они там не действуют.

Если я меняю rejectUnauthorized на true в его текущем местоположении, это работает, но, конечно, это относится коба FQDN, что не то, что я хочу.

Как я могу установить requestCert и rejectUnauthorized на основе SNI основного соединения TLS?

...