Node.js: требуется сертификат клиента для каталога (и разрешить повторную попытку). - PullRequest
2 голосов
/ 21 февраля 2012

Я хочу создать обратный прокси в узле 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.

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 22 февраля 2012

Я сам нуб, но я играю с тем же самым.

Может быть, что-то вроде

if (req.parsedUrl.pathname == '/secure' && !req.connection.getPeerCertificate().valid_to) req.parsedUrl.pathname = '/secureError';
...