2

我的公司正在考虑使用基于卡的证书(如 CAC)在网站上进行身份验证;该信息将从证书中提取,而不是用户输入用户名和密码。如何对前端进行编程以将证书传递给网络服务器?我一直在寻找具体的方向,但最后却发现了一切。总的想法是最终连接到 LDAP 之类的东西进行身份验证,但浏览器部分完全让我望而却步。

4

2 回答 2

2

您实际上不必在客户端方面做太多事情。对于网站,浏览器会为您处理它。您只需将服务器设置为需要客户端证书,浏览器就会处理它。在 Apache 下,设置 SSL 证书后,这就像在 apache 配置中设置SSLVerifyClient required手动)一样简单。然后,您的站点将需要客户端证书才能访问。您还可以设置SSLVerifyClient允许optional某人在提示选择证书时单击“取消”并且该站点仍将加载,但缺少环境变量(见下文)。

如果您使用智能卡,您可能需要智能卡阅读器的驱动程序来提示用户输入密码来查询卡,但这不是您需要处理的事情。根据我的经验(使用 CAC 卡),Internet Explorer 和 Firefox 都使用第三方软件(我们使用 ActiveIdentity)来询问用户的密码(Firefox 需要设置为使用“安全设备”,但这很简单)和Chrome 已经内置了对智能卡的支持,无需单独的程序。也可以在浏览器中安装证书,但我没有使用过。

至于验证用户,在 Apache 中,一旦浏览器和服务器完成 SSL 握手的内容,在 PHP 中就有几个可用的环境变量(你可以在phpinfo()页面上看到它们,或者如果你print_r($_SERVER). 它们都是SSL_*并且包括诸如域名或通用名称之类的东西)。这可能因客户提供的信息而异。我们刚刚找到了一个为卡片保存唯一 ID 的卡片$_SERVER['SSL_CLIENT_S_DN_CN'],并将其存储在每个帐户中。然后我们可以使用该 id 来查询帐户以创建经过验证的用户会话。

于 2016-03-15T22:26:16.903 回答
2

SSL 客户端证书在 SSL 握手中提供,这是在较低层完成的,因此对前端是透明的(浏览器在内部处理它)。需要将 Web 服务器配置为接受或要求客户端证书,以便在 SSL 握手中请求它们。

客户端证书随后由 Web 服务器验证,然后您通常可以通过某些 API 访问客户端的身份,具体取决于服务器/平台。

编辑:这是 nginx/PHP 的指南:http: //nategood.com/client-side-certificate-authentication-in-ngi

于 2016-01-15T13:30:55.610 回答