我们有多个子域,每个子域在 httpd.conf 中都有自己的虚拟主机条目,并且(对于支持 https 的子域)在 ssl.conf 中也有自己的虚拟主机条目。我们的主要 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 和 key 文件是按照找到的说明使用 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
如果有人能对我遇到的问题提供一些帮助,我将不胜感激。
答案1
确保 api.bulbstorm.com 和 www.bulbstorm.com 虚拟主机位于不同的 IP 地址。以下是针对具有唯一 SSL 证书的 2 个不同子域的虚拟主机配置:
/usr/local/etc/apache22/Includes/login.domain.com.ssl.conf
Listen 10.0.0.152:443
<VirtualHost 10.0.0.152:443>
ServerAdmin [email protected]
DocumentRoot /web0/cloud/login.domain.com/current
ServerName login.domain.com
ServerAlias www.login.domain.com login.domain.com
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog /var/log/www/login.domain.com-access_log
ErrorLog /var/log/www/login.domain.com-error_log
<DIRECTORY /web0/cloud/login.domain.com/current>
Allow from All
OPTIONS Indexes Includes ExecCGI FollowSymLinks
AllowOverride ALL
</DIRECTORY>
IndexOptions FancyIndexing
AddType application/x-httpd-php .html
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl.crt/login.domain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl.key/login.domain.com.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl.crt/comodo.ca-bundle"
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
/usr/local/etc/apache22/Includes/admin.domain.com.ssl.conf
Listen 10.0.0.151:443
<VirtualHost 10.0.0.151:443>
ServerAdmin [email protected]
DocumentRoot /web0/cloud/admin.domain.com/current
ServerName admin.domain.com
ServerAlias www.admin.domain.com admin.domain.com
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog /var/log/www/admin.domain.com-access_log
ErrorLog /var/log/www/admin.domain.com-error_log
<DIRECTORY /web0/cloud/admin.domain.com/current>
Allow from All
OPTIONS Indexes Includes ExecCGI FollowSymLinks
AllowOverride ALL
</DIRECTORY>
IndexOptions FancyIndexing
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl.crt/admin.domain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl.key/admin.domain.com.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl.crt/comodo.ca-bundle"
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
答案2
正如 amishgeek 指出,并且 ping 也证实:
Microsoft Windows [版本 6.0.6002] 版权所有 (c) 2006 Microsoft Corporation。保留所有权利。 C:\Users\Owner>ping bulbstorm.com 正在 Ping bulbstorm.com [216.139.247.153],数据为 32 字节: Control-C ^C C:\Users\Owner>ping www.bulbstorm.com 使用 32 字节数据对 www.bulbstorm.com [216.139.247.153] 进行 ping 操作: Control-C ^C C:\用户\所有者>ping api.bulbstorm.com 使用 32 字节数据对 api.bulbstorm.com [216.139.247.153] 执行 ping 操作: Control-C ^C C:\用户\所有者>
两个主机的 IP 地址相同。SSL 在发送主机名之前发生。主机名通过 HTTP 请求中的 Host: 标头发送到 Apache。在 OpenSSL 1.0 中,将支持TLS 证书,这可能有助于共享 IP,但那是另一回事,而且不止于此谷歌搜索。
链接:
- A来自 PositiveSSL 的链接,另一家 SSL 证书颁发机构
- 一个来自对同一问题进行故障排除的某人的条目。
- 和,从马嘴里(阿帕奇):http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
解决方法:
根据维基百科中有关 TLS 的条目:你应该调整你的证书来支持多个主题替代名称(GoDaddy 有“UCC 证书"),或者获取通配符证书。
根据您的用户群,您可以要求用户支持 CACert 根证书并获得来自他们的 subjectAltName 证书。 (事实上,您当前的证书似乎有一个 subjectAltName,分别为 bulbstorm.com 和 www.bulbstorm.com)。这样每年可以为您节省 70.00 美元。在非 SSL 页面或 SSL 页面上放置一个链接,内容如下
答案3
最后回答你的问题,这是如何生成自签名 SSL 证书。
首先,此行将生成一个用于生成证书签名请求(CSR)的私钥。
openssl genrsa -des3 -out server.key 1024
系统将提示您输入密码。此密码将加密私钥。下一行将使用您的私钥生成 CSR。
openssl req -new -key server.key -out server.csr
然后,系统将提示您输入以下问题(如果您选择在生成私钥时使用上面的密码,则还会提示您的密码。)
Country Name (2 letter code) [GB]:
State or Province Name (full name) [Berkshire]:
Locality Name (eg, city) [Newbury]:
Organization Name (eg, company) [My Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
编辑:如果您确实生成了自签名证书用于测试,Common Name
上面的字段就是您要放置域名的地方(完全按照您的意愿,即如果www
您希望将其作为您使用的地址)。生成 CSR 后,您可以按照以下步骤对其进行自签名。
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
然后,您将拥有您的私钥(server.key
)和 SSL 证书(server.crt
),您可以使用上面对其他证书使用的指令在 Apache 中安装它们。
我不确定这是否能回答有关向浏览器发送明显错误的证书的任何问题,但我建议也许删除该VirtualHost
指令之外的所有对证书文件的引用,以查看它是否仍然发生,因为您实际上每个 IP 地址只能拥有一个 SSL 主机,而拥有多个SSLCertificateFile
指令可能会产生不寻常的影响。