证书中的主机名与通配符证书不匹配

时间:2014-03-28 19:57:58

标签: java apache ssl

这可能是apache / server配置,也可能需要Java解决方案。在我的服务器上,我有几个子域。我在所有子域上强制使用https,并且我有一个用于所有子域的通配符ssl证书。

当我转到https://myapp1.myvendor.com并在浏览器中查看证书时,我看到以下常用名称:

CN = * .myvendor.com

我还有一个发布到https://myapp1.myvendor.com/post.php的Java程序,但是当我使用以下命令从Java发布时:

org.apache.http.client.methods.HttpPost httpPost = new HttpPost("https://myapp1.myvendor.com/post.php");
HttpResponse response = httpClient.execute(httpPost);

我收到以下错误:

javax.net.ssl.SSLException: hostname in certificate didn't match: 
<myapp1.myvendor.com> != <myvendor.com> OR <myvendor.com> OR <www.myvendor.com>

令我感到奇怪的是,它试图匹配myvendor.com或www.myvendor.com而不是* .myvendor.com。我确实为myvendor.com安装了证书,但我停止使用它来支持通配符证书。

有什么建议吗?您需要更多信息吗?

Apache配置:

<VirtualHost *:443>
 SSLEngine On
 SSLCertificateFile /etc/pki/tls/certs/27c7d7842bf94d.crt
 SSLCertificateKeyFile /etc/pki/tls/private/mydomain.key
 SSLCACertificateFile /etc/pki/tls/certs/my_cert.crt

 ServerName myapp1.myvendor.com
 DocumentRoot /var/www/myvendor/myapp1/src/
 ErrorLog /var/www/logs/myapp1/error.log
 CustomLog /var/www/logs/myapp1/access.log combined
 <Directory /var/www/myvendor/myapp1/src/>
         AllowOverride All
 </Directory>
</VirtualHost>

我还在一个IS加载的配置文件中找到了这个:

<VirtualHost _default_:443>
 SSLCertificateFile /etc/pki/tls/certs/local.crt
 SSLCertificateKeyFile /etc/pki/tls/private/local.key
 SSLCACertificateFile /etc/pki/tls/certs/my_local_cert.crt
</VirtualHost>

我认为它正在获得此证书,因为该证书具有:

subject Alternative name:
 DNS Name=myvendor.com
 DNS Name=www.myvendor.com

匹配来自Java的错误。如果是这种情况,我的问题是为什么Java获得此证书而不是浏览器获得的证书?

1 个答案:

答案 0 :(得分:0)

看起来你正在使用SNI,例如具有不同证书的同一IP上的多个https服务器。在这种情况下,请查看Server Name Indication (SNI) on Java如何在Java中使用SNI。