这可能是一个 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>
我还在加载的另一个配置文件中发现了这一点:
<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 获得此证书而不是浏览器获得的证书?
最佳答案
看起来您正在使用 SNI,例如具有不同证书的同一 IP 上的多个 https 服务器。在这种情况下,请查看 Server Name Indication (SNI) on Java如何在 Java 中使用 SNI。
关于java - 证书中的主机名与通配符证书不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722085/