为什么Apache返回一个错误的证书?

我有两年前运行的SSL通配符证书foo.es站点。 现在我想在同一台服务器上安装另一个“**。foo.com *”的证书。 我已经将新的foo_com.crt和foo_com.key文件复制到新的服务器,并添加了一个新的条目到ssl.conf

<VirtualHost foo.com:443> ServerAdmin [email protected] DocumentRoot /var/www/foo.com/ Servername foo.com ServerAlias www.foo.com ErrorLog /usr/local/apache/logs/error_log TransferLog /usr/local/apache/logs/access_log SSLEngine on SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM SSLCertificateFile /etc/httpd/ssl.crt/foo_com.crt SSLCertificateKeyFile /etc/httpd/ssl.key/foo_com.key SSLCertificateChainFile /etc/httpd/ca/sub.class2.server.ca.pem SSLCACertificateFile /etc/httpd/ca/ca.pem SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown CustomLog /usr/local/apache/logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" </VirtualHost> 

有了这个,我希望访问https://foo.com没有任何问题。 相反,浏览器警告一个ssl_error_bad_cert_domain错误代码。 当我看到证书时,我发现证书通用名是**。foo.es *,它是第一个证书(注意,我仍然安装了这个证书,我同时需要)。

Apache错误日志只说这个:

 [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate wildcard CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate CommonName (CN) `*.foo.com' does NOT match server name!? [Wed Jan 23 22:53:56 2013] [warn] RSA server certificate wildcard CommonName (CN) `*.foo.com' does NOT match server name!? 

发生了什么? 为什么浏览器获得foo.es证书,但Apache日志报告foo.com证书有问题?

运行:Apache / 2.0.59(Unix)mod_ssl / 2.0.59 Gentoo发行版中的OpenSSL / 0.9.8g

在版本2.2.12之前,Apache不支持SNI 。 在此之前,Apache只是提供了第一个证书。 解密请求后,它仍然会匹配正确的虚拟主机。

如果你只有一个IP地址,你将不得不升级Apache。 (即使你拥有多个IP地址,Apache自2.0.59以来已经有了很长的路要走,除非你需要更老的版本,否则你应该升级它。)

有些浏览器和操作系统也不支持SNI。 如果您的网站访问者使用不支持SNI的浏览器之一,则必须查看第二个IP地址。