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

时间:2016-01-12 20:57:59

标签: javascript ssl certificate cac

我的公司正在考虑使用基于卡的证书(如CAC)在网站上进行身份验证;而不是用户输入用户名和密码,这些信息将从证书中提取。如何编写前端编程以将证书传递到Web服务器?我一直在寻找具体的方向,但除此之外的一切都结束了。最重要的想法是最终挂钩到类似LDAP的身份验证,但浏览器部分完全是我的想法。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

你不必在客户方面做很多事情。对于网站,浏览器会为您处理。您只需将服务器设置为需要客户端证书,浏览器就会处理它。在Apache下,在设置SSL证书之后,这就像在apache配置中设置SSLVerifyClient requiredmanual)一样简单。然后,您的站点将需要客户端证书才能访问。您还可以将SSLVerifyClient设置为optional,以便有人点击"取消"当提示选择证书时,该站点仍将加载,但缺少环境变量(见下文)。

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

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