java - 如何修复证书中的主机名不匹配

标签 java ssl unirest

我正在使用 Unirest for Java 向 https 网站发出 HTTP 请求,但我遇到了 SSL 证书问题。异常消息 - javax.net.ssl.SSLException:证书中的主机名不匹配:

页面:www.ceskereality.cz

如果我在浏览器中打开它(我在 Windows 10 上使用谷歌浏览器),它可以工作...

我试过了,还是不行

SSLContext sslcontext = SSLContexts.custom()
                .loadTrustMaterial(null, new TrustSelfSignedStrategy())
                .build();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .build();
Unirest.setHttpClient(httpclient);

最佳答案

服务端要求客户端使用Server Name Indication (SNI)以获得正确的证书。如果未使用 SNI,则返回 ci.cz 而不是 ceskereality.cz 的证书,这会导致您看到的错误。

我不熟悉 Unirest,但您使用的库可能不支持 SNI,或者您使用的是未启用 SNI 的旧 Java 版本。

关于java - 如何修复证书中的主机名不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53870373/

相关文章:

java - 是否可以通过 war 路径为所有类添加一些功能?

java - 两个网页之间的通信

java - 如何使用 stringbuilder 添加每隔一个字符并以空格重新开始?

java - Java SSL证书

windows - 使用 nxlog 使用 om_ssl 将日志从 Windows 发送到 Logstash

ruby-on-rails - 使用 GoDaddy 颁发的 SSL 访问 Heroku 站点时出现 SSL 协议(protocol)错误

java - 如何模拟 Unirest 链接方法?

Java "Broken Pipe"错误(使用 Unirest http 包装器)

java - 两个相同的 ByteBuffer 表现不同

c# - 使用 Unirest C# 将 http 响应主体转换为 JSON 格式