[英]How Do You Program a Website to Use a Certificate for Authentication?
我公司正在考虑使用基于卡的证书(例如CAC)在网站上进行身份验证; 而不是用户输入用户名和密码,此信息将从证书中提取。 如何对前端进行编程以将证书传递到Web服务器? 我一直在寻找特定的方向,但是除了那件事之外,其他所有内容都没有。 总的来说,最终还是要加入LDAP之类的东西来进行身份验证,但是浏览器部分完全使我难以理解。
SSL客户端证书在SSL握手中显示,该握手在较低层完成,因此对前端是透明的(浏览器在内部进行处理)。 需要将Web服务器配置为接受或要求客户端证书,以便在SSL握手中请求它们。
然后,客户端证书由Web服务器验证,然后您可以根据服务器/平台,通常通过某些API来访问客户端的身份。
编辑:这是Nginx / PHP的指南: http : //nategood.com/client-side-certificate-authentication-in-ngi
您实际上并不需要在客户端方面做很多事情。 对于网站,浏览器会为您处理。 您只需将服务器设置为需要客户端证书,然后浏览器即可处理它。 在Apache下,设置SSL证书后,这就像在apache配置中设置SSLVerifyClient required
( 手册 )一样简单。 然后,您的站点将需要客户端证书才能访问。 您还可以将SSLVerifyClient
设置为optional
,允许他人在提示您选择证书时单击“取消”,并且该站点仍会加载,但缺少环境变量(请参见下文)。
如果使用的是智能卡,则可能需要智能卡读卡器的驱动程序来提示用户输入密码以查询卡,但这不是您需要处理的事情。 以我的经验(使用CAC卡),Internet Explorer和Firefox都使用第三方软件(我们使用ActiveIdentity)询问用户的密码(需要将Firefox设置为使用“安全设备”,但很简单),并且Chrome已经内置了对智能卡的支持,而无需单独的程序。 也可以在浏览器中安装证书,但是我还没有使用它。
至于验证用户,在Apache中,一旦浏览器和服务器完成了SSL握手操作,在PHP中,就有几个可用的环境变量(您可以在phpinfo()
页面上查看它们,也可以在print_r($_SERVER)
都是SSL_*
并包含域名或通用名称之类的内容。 这可能会根据客户端提供的信息而有所不同。 我们刚刚找到了一个拥有$_SERVER['SSL_CLIENT_S_DN_CN']
卡的唯一ID的人,并将其存储在每个帐户中。 然后,我们可以使用该ID来查询用于创建经过验证的用户会话的帐户。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.