Результат `req.socket.authorized` неверен при использовании nodejs https и express [взаимная аутентификация] - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь настроить https-сервер с взаимной аутентификацией.
Я создал ключ и сертификат для сервера (с автоподписью).

Теперь я использую firefox для подключения на сервер без предоставления клиентского сертификата .
Это должно привести к req.socket.authorized, равному false (как указано здесь ), но по какой-то причине после некоторых обновлений ( и ничего не меняя) сообщение меняется с правого
Unauthorized: Client certificate required (UNABLE_TO_GET_ISSUER_CERT)
на
Client certificate was authenticated but certificate information could not be retrieved.

Для меня это неожиданно, потому что это означает, что req.socket.authorized == true даже без клиентских сертификатов , Может кто-нибудь объяснить мне, почему это происходит?


Вот мой код:

const express = require('express')
const app = express()
const fs = require('fs')
const https = require('https')

// ...

const opts = { key: fs.readFileSync('./cryptoMaterial/private_key.pem'),
               cert: fs.readFileSync('./cryptoMaterial/certificate.pem'),
               requestCert: true,
               rejectUnauthorized: false,
               ca: [ fs.readFileSync('./cryptoMaterial/certificate.pem') ]
             }

const clientAuthMiddleware = () => (req, res, next) => {
    if (!req.secure && req.header('x-forwarded-proto') != 'https') {
        return res.redirect('https://' + req.header('host') + req.url);
    }

    // Ensure that the certificate was validated at the protocol level
    if (!req.socket.authorized) { // <-- THIS SHOULD BE ALWAYS FALSE
        res.status(401).send(
            'Unauthorized: Client certificate required ' + 
                '(' + req.socket.authorizationError + ')'
        );
        return
    }

    // Obtain certificate details
    var cert = req.socket.getPeerCertificate();
    if (!cert || !Object.keys(cert).length) {
        // Handle the bizarre and probably not-real case that a certificate was
        // validated but we can't actually inspect it
        res.status(500).send(
            'Client certificate was authenticated but certificate ' +
                'information could not be retrieved.'
        );
        return
    }
    return next();
};
app.use(clientAuthMiddleware());

// ...

https.createServer(opts, app).listen(PORT)
...