我们有多个子域,每个子域在 httpd.conf 中都有自己的虚拟主机条目,在 ssl.conf 中也有(对于那些支持 https 的)。我们的主要 www 子域具有与之关联的 GoDaddy 证书。我现在在我们的开发环境中配置的子域(“api.bulbstorm.com”)有一个 ssl.conf 虚拟主机条目,如下所示:
<VirtualHost 172.16.247.153:443>
DocumentRoot "/var/www/api"
ServerName api.bulbstorm.com:443
ErrorLog logs/api-error_log
CustomLog logs/api-access_log common
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /var/www/certs/api/server.crt
SSLCertificateKeyFile /var/www/certs/api/server.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
<Directory "/var/www/api">
Options +FollowSymLinks
RewriteEngine On
AllowOverride All
Order allow,deny
Allow from all
</Directory>
php_value include_path "/var/www/inc"
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
... /var/www/certs/api/ 中的 crt 和密钥文件是根据此处找到的说明使用 openssl 生成的。
api 子域最初指向 www 子域的 godaddy 证书。但是即使我已经将与 api 子域关联的虚拟主机条目更改为指向自签名证书/密钥对(并重新启动了 httpd,完全清除了与上一个 godaddy 证书异常相关的浏览器设置等)浏览器仍在发出警告说证书适用于 www 域。当我查看证书时,浏览器正在拉取它,看起来他们仍在获得 Godaddy 证书。
在 ssl.conf 文件的较高位置有以下几行:
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
此证书/密钥对不同于 www 子域的虚拟主机条目中引用的 godaddy 证书/密钥对,如下所示:
SSLCertificateFile /etc/www.bulbstorm.com_ssl/www.bulbstorm.com.crt
SSLCertificateKeyFile /etc/www.bulbstorm.com_ssl/www.bulbstorm.com.key
SSLCertificateChainFile /etc/www.bulbstorm.com_ssl/gd_intermediate_bundle.crt
任何人都可以对我遇到的问题提出任何意见,我们将不胜感激。
确保 api.bulbstorm.com 和 www.bulbstorm.com 虚拟主机位于不同的 IP 地址上。这是我对具有唯一 SSL 证书的 2 个不同子域的虚拟主机配置:
/usr/local/etc/apache22/Includes/login.domain.com.ssl.conf
/usr/local/etc/apache22/Includes/admin.domain.com.ssl.conf
正如 amishgeek 指出的那样,并且 ping 确认:
两台主机的 IP 地址相同。SSL 在发送主机名之前发生。主机名通过 HTTP 请求中的 Host: 标头发送到 Apache。在 OpenSSL 1.0 中,将支持TLS 证书,这可能有助于共享 IP,但这是另一回事,更多的是Google 搜索。
链接:
解决方法:
根据关于 TLS 的 Wikipedia 条目:您应该调整您的证书以支持多个主题替代名称(GoDaddy 具有“ UCC Certs ”),或者获取通配符证书。
根据您的用户群,您可以要求用户支持 CACert 根证书并从他们那里获得 subjectAltName 证书。(实际上,您当前的证书看起来有一个为bulbstorm.com 和www.bulbstorm.com 的subjectAltName)。这为您每年节省 70.00 美元。在您的非 SSL 页面或 SSL 页面上放置一个链接,上面写着类似
最后回答您的问题,这是如何生成自签名 SSL 证书。
首先,此行将生成用于生成证书签名请求 (CSR) 的私钥。
系统将提示您输入密码。此密码将加密私钥。下一行将使用您的私钥生成 CSR。
然后,系统将提示您输入以下问题(如果您在生成私钥时选择使用上述问题,则将提示您的密码。)
编辑:如果您确实生成了用于测试的自签名证书,则
Common Name
上面的字段就是您要放置域的位置(完全按照您的意愿,即www
如果您希望将其作为您使用的地址)。生成 CSR 后,您可以执行以下操作对其进行自签名。然后,您将拥有您的私钥 (
server.key
) 和 SSL 证书 (server.crt
),您可以使用上面用于其他证书的指令将其安装在 Apache 中。我不确定这是否回答了有关发送到浏览器的明显不正确证书的任何问题,但我建议也许删除对该
VirtualHost
指令之外的证书文件的所有引用,看看它是否仍然发生,因为你只是真的能够为每个 IP 地址拥有一个 SSL 主机,并且拥有多个SSLCertificateFile
指令可能会产生不寻常的效果。