【发布时间】:2013-01-06 15:39:25
【问题描述】:
我有一个基于 node.js 的 Web 应用程序,它需要来自客户端的安全 (https) 连接。我想要的是在某些路径上需要客户端证书身份验证,而在其他路径上则不需要。
例如。如果用户转到https://www.example.com/main,则服务器不需要客户端证书身份验证(因此浏览器不会询问任何内容)。但是如果用户导航到https://www.example.com/secure,则需要客户端证书身份验证(因此浏览器会弹出一个对话框选择使用哪个证书)。
我怎样才能做到这一点。如果我将requestCert:true 和rejectUnauthorized:true 传递给https.createServer 选项,我可以强制客户端证书身份验证。这种方法的问题是每个路径都需要客户端证书。
【问题讨论】:
-
客户端证书是 SSL 握手的一部分;我不确定你能做你想做的事。
-
@Joe:这就是我所害怕的。但我见过这样做的网站。首先,这些应用程序会显示一个页面,要求用户插入智能卡(客户端证书所在的位置)。当您按“确定”时,应用程序会将用户重定向到同一应用程序中需要客户端证书的另一个路径。此时浏览器会显示一个对话框供用户选择使用的证书。那么,也许有办法在同一个连接中强制进行新的握手?
-
我有办法解决这个问题,但我不想使用它。一种解决方案是在同一个应用程序中使用两个不同的侦听器(不同的端口)。另一个需要客户端证书身份验证,另一个不需要。这种方法的问题是我必须为第二种方法使用非标准端口。这导致一些客户需要重新配置他们的防火墙以允许连接到该端口。
-
@Jukka:你找到单独监听器的替代方案了吗?
-
也许是npmjs.com/package/client-certificate-auth——虽然我自己没有测试过。