您如何对网站进行编程以使用证书进行身份验证?

How Do You Program a Website to Use a Certificate for Authentication?

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

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

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

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

您实际上不必在客户端方面做太多事情。对于网站,浏览器会为您处理。您只需将服务器设置为需要客户端证书,浏览器就会处理它。在 Apache 下,设置好 SSL 证书后,只要在 apache 配置中设置 SSLVerifyClient required (manual) 就可以了。然后,您的站点将需要客户端证书才能访问。您还可以将 SSLVerifyClient 设置为 optional,这允许有人在提示 select 证书时单击 "Cancel",站点仍将加载,但缺少环境变量(请参阅下面)。

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

至于验证用户,在 Apache 中,浏览器和服务器完成 SSL 握手后,PHP 中有几个可用的环境变量(您可以在 phpinfo() 页面,或者如果您 print_r($_SERVER)。它们都是 SSL_*,包括域名或通用名称等内容)。这可能会根据客户端提供的信息而有所不同。我们刚刚找到了一个拥有卡 $_SERVER['SSL_CLIENT_S_DN_CN'] 唯一 ID 的卡,并将其存储在每个帐户中。然后我们可以使用该 ID 来查询用于创建经过验证的用户会话的帐户。