【发布时间】:2020-05-19 17:36:24
【问题描述】:
在生产中,我的网站使用 Let's Encrypt 证书,以便用户可以在浏览器中看到有效的证书锁定。 如果用户导航到路由 example.com/dashboard,我希望使用客户端证书(而不是用户名/密码)登录。
我使用 openssl 私钥和公钥在服务器上生成。公钥保留在服务器上,私钥发送给客户端。
使用这个tutorial,我在server.js中创建了
const express = require('express')
const https = require('https')
const fs = require('fs')
const masterapp = express()
var options = {
key: fs.readFileSync('/etc/ssl/certs/sslforfree/private.key'),
cert: fs.readFileSync('/etc/ssl/certs/sslforfree/certificate.crt'),
requestCert: true,
rejectUnauthorized: false,
}
然后在中间件中
const cert = req.connection.getPeerCertificate()
if (req.client.authorized) {
if (cert.subject.CN === "Client123" && cert.fingerprint256 === "AA:BB:CC:DD:00..
在 Mac OS 上,它会在我选择密钥的浏览器中正确显示提示(密钥存储在钥匙串中)。
问题:
- req.client.authorized 始终为 false
- 如何使用 Node.js 安全地检查私钥是否对应于公钥?
- 拥有dashboard.example.com 子域或路由example.com/dashboard(快速路由器)是否更安全?
【问题讨论】:
标签: node.js express ssl https openssl