首先,请注意我是配置 SSL 的新手。过去,我一直很幸运有一个 IT 部门提前为我设置。因此,请做好准备,我可能需要对您的一些答案进行澄清。=)
我想要做什么
我正在为员工建立一个公司内部网站。例如,将有一个浏览器起始页,显示为每个员工定制的内容。因此,我需要能够在不需要任何用户名/密码或其他提示的情况下识别所述员工(尽管一次性设置是可以的;我只是不希望他们每次都被提示)。当然,SSL 似乎是最好的方法。
我将有一个 MySQL 数据库设置来将“用户”帐户与 SSL_CLIENT_M_SERIAL 和 SSL_CLIENT_I_DN 相关联,我假设每个客户端证书都是唯一的(?)。我从这篇文章中得到了这个想法:http: //cweiske.de/tagebuch/ssl-client-certificates.htm
用户第一次访问内部网站时,他们将没有证书(我不想为客户端手动生成它们!),在这种情况下 $_SERVER["SSL_CLIENT_VERIFY"] == "NONE"。如果发生这种情况,它将转到用户帐户设置页面,其中包括 PHP 生成 SSL 客户端证书并将其发送到浏览器以供用户安装的步骤。很好很简单。然后用户安装证书,建立关联,并在重新启动浏览器后(为了好的措施),用户返回内部网站。
此时,Apache 应该请求客户端证书,然后浏览器发送该证书。然后 PHP 脚本解析必要的 $_SERVER 变量,与 MySQL 数据库进行比较,所有人都度过了美好的时光。再一次,又好又简单。
到目前为止的工作
我安装了服务器端证书。是的,它们是自签名的(原因很明显)。Apache 安装了 mod_ssl,一切似乎都运行良好。我创建了一个 PHP 脚本,它只转储 $_SERVER 数组,并且所有 SSL_SERVER_* 键值都与我为它创建的证书匹配。
问题
我无法让客户端证书工作!在同一个 PHP 脚本中,无论我做什么,都缺少 SSL_CLIENT_VERIFY == "NONE" 和其他 SSL_CLIENT_* 键。如果我在 ssl.conf 中将 SSLVerifyClient 设置为可选,就会发生这种情况。根据我读过的每个教程,他们都说网络服务器应该向浏览器请求客户端证书。问题是,我不能让它这样做!它直接进入 PHP 脚本并假设我根本没有客户端证书。这发生在 Firefox、Chrome 和 IE 中。
所以我尝试将 SSLVerifyClient 设置为 required 并重新启动网络服务器。有了这个选项,我什至无法建立 SSL 连接。Firefox 只是说连接已被重置(其他浏览器也会显示他们自己的错误版本)。奇怪的是日志没有显示这些连接尝试的任何活动!即 access_log、error_log、ssl_access_log、ssl_error_log 和 ssl_request_log 都没有显示任何内容;就好像这种尝试从未发生过。这令人沮丧,因为这意味着我什至没有错误消息可供使用。只是一个网络服务器被动地告诉我下地狱。
我尝试使用 PHP 的 OpenSSL 扩展手动生成/安装我自己的客户端证书。证书安装得很好,虽然我找不到任何关于如何将该证书与服务器相关联的信息(假设我什至需要?)。此外,这似乎并不重要,因为如果设置了 optional,Apache 甚至不会请求客户端证书。如果设置了require,它只会在没有解释的情况下爆炸。无论如何,我都需要将其设置为可选,以使该模式正常工作。
环境
操作系统:CentOS 5.7 64 位(虚拟机)
阿帕奇:2.2.3
PHP: 5.3.10
我猜您可能需要更多信息来帮助我,所以请询问!我会为你提供你需要的任何东西。
总而言之,在上述条件下,我需要知道如何让 Apache 请求 SSL 客户端证书。此外,如果必须执行任何特殊的签名/等操作以使客户端证书与服务器证书“兼容”(同样,无需通过 shell 手动为每个客户端证书执行此操作!),我需要知道这一点出色地。
到目前为止,我 100% 坚持这一点。在 Google 上什至找不到任何有帮助的东西。非常感谢您对此提供的任何帮助!谢谢!=)