1

我正在我的登录端点上检查客户端证书。使用 Postman 等进行测试一切正常,但我无法使用我的 mocha/chai-http 单元测试运行它。

const ca = fs.readFileSync(path.join(__dirname, '..', process.env.SERVER_CERT_FILE));
const cert = fs.readFileSync(path.join(__dirname, '..', process.env.CLIENT_CERT_FILE));
const key = fs.readFileSync(path.join(__dirname, '..', process.env.CLIENT_KEY_FILE));

describe('POST /login', () => {
        it('validates the certificate', (done) => {
            chai.request(app)
                .post('/api/login')
                .ca(ca)
                .key(key)
                .cert(cert)
                .send(userData)
                .end((err: Error, res: any) => {
                    /* checks */
                    done();
                });
        });

我什至不能req.socket.getPeerCertificate()那样做。有人知道这将如何工作吗?

我的登录控制器方法:

login = (req: any, res: any, next: any) => {
    if (!req.client.authorized) {
        sendJSONResponse(res, 'Missing or invalid client certificate', 401);
        return;
    }
    /* .... */
 }

我的服务器选项

const options = {
        key: fs.readFileSync(process.env.SERVER_KEY_FILE),
        cert: fs.readFileSync(process.env.SERVER_CERT_FILE),
        requestCert: true,
        rejectUnauthorized: false,
        ca: [
            fs.readFileSync(process.env.SERVER_CERT_FILE)
        ]
    };
    https.createServer(options, this.app).listen(port, () => {
        /*...*/;
    });
4

1 回答 1

0

您需要在 https 侦听器对象上使用 module.exports。我有同样的确切问题,并通过进行以下更改来解决。希望这可以帮助。

module.exports = https.createServer(options, app)
  .listen(443, function () {
    console.log('HTTPS App listening on port 443! Go to https://localhost:443/')
  })

于 2019-05-10T19:17:56.580 回答