【问题标题】:How to connect with client side certificates using https module on Node.js如何使用 Node.js 上的 https 模块连接客户端证书
【发布时间】: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 上,它会在我选择密钥的浏览器中正确显示提示(密钥存储在钥匙串中)。

问题:

  1. req.client.authorized 始终为 false
  2. 如何使用 Node.js 安全地检查私钥是否对应于公钥?
  3. 拥有dashboard.example.com 子域或路由example.com/dashboard(快速路由器)是否更安全?

【问题讨论】:

    标签: node.js express ssl https openssl


    【解决方案1】:

    根据您引用的中篇文章,您需要在选项对象中提供ca 属性。这应该是您信任的客户端 CA 的列表:

    最后,我们提供了我们认为有效的 CA 证书列表。目前,我们使用自己的服务器密钥签署客户端证书,因此它与我们的服务器证书相同。

    , ca: [ fs.readFileSync('server_cert.pem') ]
                 }
    

    您应该使用 CA 对客户端生成的密钥的公钥进行签名。为此,您必须使用私钥生成 CSR,然后使用列表中的 CA 签署 CSR。完成此操作后,您可以将私钥和生成的证书打包发送给客户端,他们将能够针对您的系统进行身份验证。

    1. 这是因为您离开了 ca 属性。
    2. 一旦您拥有受信任的ca,浏览器和您的服务器之间就会自动发生这种情况。
      1. 要创建 CA,您可以使用 openssl 到 generate a self-signed certificate and private key
    3. 这取决于并且超出了 stackoverflow 的范围。您可以考虑在serverfault.comsecurity.stackexchange.com 上提问。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2018-09-15
      相关资源
      最近更新 更多