我想为我们公司实现一个内部站点,并尽可能使用证书身份验证。我遇到(并尝试过)各种示例,其中人们为所有内容创建自己的自签名 CA,但这不是我想要的。
出于安全原因,我不想使用我们实际的通配符站点证书来开发它 - 具有私钥文件的服务器越少越好。我想做的是这样的:
a) 使用自签名 CA 并签署用于 HTTPS 的 SSL 证书,并将其添加到我的系统证书存储中。就本次冒险而言,这将是第一个 CA,或ca-1
.
b) 使用颁发我们的 S/MIME 证书的 CA 进行身份验证(他们是正确的类型!)用于此目的的证书(客户端身份验证)将由第二个 CA 颁发,或ca-2
。
最终,开发完成后,我计划将ca-1
a) 的站点和证书替换为我们的 SSL 证书提供商的站点和证书,以方便最终用户和安全,但为了开发用户身份验证,我想使用我的真正的证书,因为只有公钥将存储在开发服务器上 - 从开发的角度来看,使用真实的证书更有用。
从能够为 SSL/TLS 和身份验证选择单独的 CA 的角度来看,我也有兴趣了解如何完成这项工作。 (这只是老式的好奇心。)
我的 HTTPd 配置 ( /etc/httpd/conf.d/site.conf
) 看起来有点像这样:
<VirtualHost *:443>
ServerName site
DocumentRoot /srv/site/www
SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLHonorCipherOrder On
SSLCertificateFile /etc/pki/tls/certs/site-1.crt
SSLCertificateKeyFile /etc/pki/tls/private/site-1.key
SSLCertificateChainFile /etc/pki/tls/certs/ca-1.crt
SSLCACertificateFile /etc/pki/tls/certs/ca-2.crt
</VirtualHost>
<Directory /srv/site/www>
Require all granted
</Directory>
<Directory /srv/site/www/secret>
SSLVerifyClient require
SSLVerifyDepth 1
SSLOptions +StdEnvVars
SSLVerifyClient require
Require all granted
</Directory>
<VirtualHost *:80>
ServerName site
RewriteEngine On
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>
我也知道需要使用restorecon -RvF /srv
SELinux(我已经这样做了。)
这个想法是有一个开放的启动页面,这样即使是未经身份验证的用户也可以显示图形(并在重试之前提醒他们在计算机上安装证书,而不是简单地向他们显示一个页面。)目录403 Forbidden
中的内容/secret
然而,在文档根目录中,仅向经过身份验证的用户显示。垃圾页面上的少量 PHP 会检测 /secret 中内容的可用性,并自动重定向用户。
计划是让 HTTPd 仅对拥有我们的 CA 签名的证书的用户进行身份验证(ca-2.crt
在本例中就是这样),当然,Web 应用程序必须检查证书中的组织 (O) 是否是我们的。之后,一旦应用程序对 CA 和 O(组织)感到满意,用户证书中由浏览器共享的 CN(通用名称)将用于对它们进行身份验证,可能使用 OU(组织单位) )根据部门划分权利。
和许多想法一样,无论如何,乍一看,这似乎是一个不错的想法。然而,在实践中,它并没有达到预期的效果:我的浏览器只是向我显示一个403 Forbidden
错误,似乎没有/var/log/httpd
提及原因。/secret
当然,外部内容也可以正常工作。
和属于.site-1.crt
将是对我的智能卡上的私钥进行签名的 CA(我的主机操作系统知道这一点:我已经使用它来签名和加密电子邮件、通过 SSH 登录到服务器等,所以我很满意)确保它有效。)site-1.key
ca-1.crt
ca-2.crt
我还准备接受必须将所有用户的公钥添加到列表中,HTTPd 将根据该列表进行身份验证。不太方便,但肯定安全(而且它还允许更细粒度的访问,而不是简单地允许整个公司 - 或整个部门 - 访问资源。)
在此冒险中的任何帮助将不胜感激。