NodeJS 客户端身份验证无法正常工作(使用证书)

mnemlml8  于 2023-01-08  发布在  Node.js
关注(0)|答案(1)|浏览(211)

我想检查(动态通过配置文件)客户端证书,但这不能正常工作。
如果我没有证书,我仍然可以访问该网站有时.
这是我的密码
服务器:

const { createServer } = require("https")

// config.ssl.client_crt = true or false

createServer({
      cert: readFileSync(config.ssl.crt_file),
      key: readFileSync(config.ssl.key_file),
      requestCert: config.ssl.client_crt,
      rejectUnauthorized: false,
      ca: readFileSync(config.ssl.ca_file),
},app).listen(config.port)

app.get("/", (req, res) => {
    authenticator.req_check(req, config.ssl.client_crt, function(ok) {
        if (! ok) {
            return res.send("nope")
        }

        return res.send("ok")
    })
});

认证者:

module.exports = {
    req_check(req, client_crt, cb) {
        if (client_crt && req.client.authorized == false) { // <-- Pay attention!
            return cb(false)

        } else {
            return cb(true)
        }
    }
}

这是可行的,但是当我这样写时,req.client.authorized的值有时会被忽略

if (client_crt && ! req.client.authorized) {
    return cb(false)
}

我认为是一样的,还是我错了?
当然我不希望任何人访问网站没有证书,所以我需要你的帮助,使检查绝对可靠

lhcgjxsq

lhcgjxsq1#

如果要强制执行客户端证书授权,则必须设置rejectUnauthorized: true
此外,在设置HTTPS连接时,甚至在第一个HTTPS请求通过该连接之前,都应该检查证书:

var server = https.createServer({
  cert: readFileSync(config.ssl.crt_file),
  key: readFileSync(config.ssl.key_file),
  requestCert: config.ssl.client_crt,
  rejectUnauthorized: true,
  ca: readFileSync(config.ssl.ca_file),
}, app)
.listen(config.port, function() {
  server.on("secureConnection", function(socket) {
    var now = new Date().getTime();
    var cert = socket.getPeerCertificate();
    if (!socket.authorized ||
        now < new Date(cert.valid_from).getTime() ||
        now > new Date(cert.valid_to).getTime())
      socket.end();
 });
});

相关问题