【问题标题】:How Do You Program a Website to Use a Certificate for Authentication?您如何对网站进行编程以使用证书进行身份验证?
【发布时间】:2016-04-17 15:47:49
【问题描述】:

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

【问题讨论】:

    标签: javascript ssl certificate cac


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您实际上不必在客户端方面做太多事情。对于网站,浏览器会为您处理它。您只需将服务器设置为需要客户端证书,浏览器就会处理它。在Apache下,设置好SSL证书后,这就像在apache配置中设置SSLVerifyClient required(manual)一样简单。然后,您的站点将需要客户端证书才能访问。您还可以将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 来查询用于创建经过验证的用户会话的帐户。

      【讨论】:

        猜你喜欢
        • 2017-09-04
        • 2023-03-29
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多