У меня есть следующий рабочий код:
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?