Я хочу создать обратный прокси в узле js, где мне могут потребоваться клиентские сертификаты для определенных частей сайта.
- Раздел / secure должен требовать сертификат клиента.
- Раздел / nosecure не требует сертификата клиента.
- Пользователь должен иметь возможность повторить проверку сертификата клиента, если он не предоставил действительный сертификат ранее.
var options = {
key: fs.readFileSync(__dirname + '/key.pem'),
cert: fs.readFileSync(__dirname + '/cert.pem'),
ca: fs.readFileSync(__dirname + '/clientCA.pem'),
requestCert: true
};
https.createServer(options, function (req, res) {
//parse url
req.parsedUrl = url.parse(req.url);
//handle urls
switch(req.parsedUrl.pathname) {
case '/nosecure':
/*
* This location does not require a client cert
*/
res.end('nosecure');
break;
case '/secure':
/*
* This location requires a client certificate, which can be checked by getPeerCertificate()
* If no certificate is provided, the user will be redirected to secureError
*/
res.end('secure');
break;
case '/secureError':
/*
* This location does not require a client cert
* It displays the error page, in case the client cert was not provided/validated on /secure.
*/
res.end('Certificate validation failed. <a href="/secure">Try again</a>');
break;
default:
res.end('not found');
break;
}
}).listen(9000);
Обычно вы можете установить эти требования только на уровне сервера.
Но я мог вручную проверить сертификат в защищенном разделе.
Однако проблема остается. Я не могу попросить клиентский браузер снова отправить мне сертификат.
Это происходит только один раз, когда начинается сеанс SSL.
Есть идеи, как это исправить?