这可能是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获得此证书而不是浏览器获得的证书?
答案 0 :(得分:0)
看起来你正在使用SNI,例如具有不同证书的同一IP上的多个https服务器。在这种情况下,请查看Server Name Indication (SNI) on Java如何在Java中使用SNI。