好的,情况如下。一家名为“Corp”的公司向其所有员工颁发 SSL 证书,以访问 Corp 的 Web 资源。Corp 还为其证书颁发机构提供证书,以便其员工可以将其安装为受信任的 CA。
我正在构建一个位于公司网络之外的工具,但我想使用所有员工都已安装的 SSL 证书来在他们使用此工具时识别他们(因为只有公司员工才能使用此工具)。它运行在 Amazon 的 Linux 发行版上的 Apache 2.2 安装上。以下是我迄今为止尝试过的方法:
1)我创建并自签名了 SSL 证书,供服务器用于提供 HTTPS(“privatekey.pem”和“server.crt”)
2)我将 Corp 的 CA 证书复制到服务器(corp-ca.crt)
3)我对 Apache 使用了以下 VirtualHost 配置:
<VirtualHost *:443>
ServerName toolname.thirdparty.com
DocumentRoot /var/www/html
ServerAdmin [email protected]
ErrorLog logs/toolname-error_log
CustomLog logs/toolname-access_log common
<Directory "/var/www/html">
AllowOverride all
</Directory>
SSLEngine On
SSLCertificateFile /etc/ssl/server.crt
SSLCertificateKeyFile /etc/ssl/privatekey.pem
SSLCACertificateFile /etc/ssl/corp-ca.crt
SSLVerifyClient require
SSLVerifyDepth 1
SSLOptions +StdEnvVars
</VirtualHost>
当我尝试访问 Corp 的某个网站时,我可以从中选择我的客户端证书,并且它可以正常工作,因此我知道客户端证书已正确安装。当我使用 执行此操作时SSLVerifyClient optional
,页面可以通过 HTTPS 正常加载,因此我知道我的服务器的 SSL 设置良好。SSLVerifyClient required
但是,使用 时,我得到了一句话ERR_SSL_PROTOCOL_ERROR
:
“无法与服务器建立安全连接。这可能是服务器的问题,或者可能需要您没有的客户端身份验证证书。”
因此,这引出了我必须问的问题:我试图做的事情是否可行?我可以使用其他人颁发的客户端证书在我自己的网站验证他们的身份吗?如果真的可行,我该怎么做?
答案1
公司显然持有 CA 根证书,可能还有中间证书。因此,在这种情况下,您不能将自签名证书与公司的 CA 链一起使用。您的证书必须由公司的根证书或中间证书“签名”,并且openssl ca命令。
因此,您必须向公司的管理员发送 CSR,以便他们为您提供签名/有效的证书以供 Apache 使用。
编辑:有关更多信息,您可以使用openssl s_client命令查看您的 SSL 设置。例如:openssl s_client -connect myextapp.com:443
您将看到用于配置 apache 的证书链的输出。
答案2
您的配置似乎正确,假设签署您的客户端证书的 CA 的证书在此文件中:
/etc/ssl/corp-ca.crt
我建议您也添加另一个指令,这个:
SSLCADN请求文件
它应该指向一个文件,该文件是所有可以签署客户端证书的 CA 的串联,还有另一个警告,请参阅有关该列表的 apache 错误(从 apache 发送到客户端的可接受 CA 列表):
https://bz.apache.org/bugzilla/show_bug.cgi?id=12355
由于这一点以及浏览器可能不知道 CA 的事实,因此您可以获得准确的消息。
在这种情况下,首先确保将客户端证书安装到您的浏览器中,您需要一个包含私钥和证书的 pkcs12 文件。完成此操作后,一切都会正常工作。
要检查是否是这种情况,您可以使用 curl:
curl -k -E YOUR_CLIENT_CERT.pem --key YOUR_CLIENT_KEY.pem https://toolname.thirdparty.com
-k
因为在这种情况下您没有检查服务器的证书。