【发布时间】:2012-05-02 09:47:15
【问题描述】:
首先,请注意我是配置 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 设置为必需并重新启动网络服务器。有了这个选项,我什至无法建立 SSL 连接。 Firefox 只是说连接已被重置(其他浏览器也会显示他们自己的错误版本)。奇怪的是日志没有显示这些连接尝试的任何活动! IE。 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 上什至找不到任何有帮助的东西。非常感谢您对此提供的任何帮助!谢谢! =)
【问题讨论】:
-
生成的每个客户端证书都是自签名的吗?或者您是否创建了自己的 CA 来签署生成的请求?如果您安装了一个由受信任的机构(由服务器的信任库确定)签名的证书,客户端只会提示您提供证书。如果每个客户端证书都是自签名的,则您需要将这些生成的每个证书都放在服务器的信任库中,这是不可行的。
-
我尝试使用 openssl 在服务器上创建客户端证书,导出为 p12,然后在 Firefox 中安装它,但现在我从 Apache 收到“无法获取本地颁发者证书”错误。我使用服务器证书签署了客户端证书,为什么它不起作用?我尝试取消注释 ssl.conf 中的 SSLCACertificateFile 行,但这只是让我回到第一个问题,即页面加载正常但没有识别客户端证书。所以我又一次回到了原点......
标签: php linux apache ssl openssl