Java SSLException:证书中的主机名不匹配

2022-09-01 02:26:12

我一直在使用以下代码连接到谷歌的服务之一。此代码在我的本地计算机上工作正常:

HttpClient client=new DefaultHttpClient();
HttpPost post = new HttpPost("https://www.google.com/accounts/ClientLogin");
post.setEntity(new UrlEncodedFormEntity(myData));
HttpResponse response = client.execute(post);

我将此代码放在生产环境中,该环境阻止了 Google.com。根据要求,他们允许我访问IP :74.125.236.52 - 这是Google的IP之一,从而允许与Google服务器进行通信。我编辑了我的主机文件以添加此条目。

我仍然无法访问URL,我想知道为什么。所以我用:

HttpPost post = new HttpPost("https://74.125.236.52/accounts/ClientLogin");

现在我得到一个这样的错误:

javax.net.ssl.SSL异常:证书中的主机名不匹配:<74.125.236.52>!= <www.google.com>

我想这是因为谷歌有多个IP。我不能要求网络管理员允许我访问所有这些IP - 我甚至可能无法获得整个列表。

我现在该怎么办?在 Java 级别是否有解决方法?还是完全掌握在网络人员手中?


答案 1

您还可以尝试设置主机名验证程序,如此所述。这对我来说是为了避免这个错误。

// Do not do this in production!!!
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;

DefaultHttpClient client = new DefaultHttpClient();

SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams());

// Set verifier     
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

// Example send http request
final String url = "https://encrypted.google.com/";  
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost);

答案 2

证书验证过程将始终验证服务器提供的证书的 DNS 名称,并在客户端使用的 URL 中验证服务器的主机名。

下面的代码

HttpPost post = new HttpPost("https://74.125.236.52/accounts/ClientLogin");

将导致证书验证过程验证服务器颁发的证书的公用名是否,即 与主机名匹配,即 .显然,这必然会导致失败(您可以通过使用浏览器浏览到URL来验证这一点,并自己看到由此产生的错误)。www.google.com74.125.236.52https://74.125.236.52/accounts/ClientLogin

据说,为了安全起见,您不愿意编写自己的记录(除非您了解如何编写安全的DNS记录,否则您不会这样做),您应该考虑在数据中心建立DNS记录,以确保所有查找都将解析为;这应该在您的本地DNS服务器或操作系统文件中完成;您可能还需要向其他域添加条目。毋庸置疑,您需要确保这与ISP返回的记录一致。TrustManagerwww.google.com74.125.236.52hosts