我的机器上正在运行REST webservice,它在从浏览器访问时工作正常但在通过同一台机器上运行的Java代码访问REST调用时遇到异常。请帮我解决这个问题。尝试输入详细的代码。谢谢!! 请不要将此帖子标记为重复,我检查了其他未找到类似的问题。 我尝试使用以下代码...
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (KeyManagementException e1) {
e1.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://17.91.15.84:8088/login");
List<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
parameters.add(new BasicNameValuePair("userid", "user1"));
parameters.add(new BasicNameValuePair("password", "user1$"));
post.setEntity(new UrlEncodedFormEntity(parameters));
HttpResponse response = client.execute(post);
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
}
并且在运行服务的同一台机器上运行相同的代码时,我最终得到以下异常消息..
javax.net.ssl.SSLException: hostname in certificate didn't match: <17.91.15.84> != <My-PC>
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)
答案 0 :(得分:0)
也许证书是针对DNS的。尝试使用DNS-Name代替IP地址。
HttpPost post = new HttpPost("https://XXDNSXX:8088/login");
答案 1 :(得分:0)
您必须根据参数post
更改代码,但HttpPost
以及HttpGet
return null
中的 getAcceptedIssuers()
只是证书检查的旁路。
警告 :不要在生产环境中尝试,除非你有一个非常 通过所有证书检查的坚实理由。答案如果是,为什么 你还在使用SSL连接吗? :)
试试这个:
@Test
public void withTrustManeger() throws Exception {
DefaultHttpClient httpclient = buildhttpClient();
HttpGet httpGet = new HttpGet("https://url.url.com");
HttpResponse response = httpclient.execute( httpGet );
HttpEntity httpEntity = response.getEntity();
InputStream inputStream = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(
inputStream));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
inputStream.close();
String jsonText = sb.toString();
System.out.println(jsonText);
}
buildhttpClient()
功能如下:
private DefaultHttpClient buildhttpClient() throws Exception {
DefaultHttpClient httpclient = new DefaultHttpClient();
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, getTrustingManager(), new java.security.SecureRandom());
SSLSocketFactory socketFactory = new SSLSocketFactory(sc);
Scheme sch = new Scheme("https", 443, socketFactory);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
return httpclient;
}
此处getTrustingManager()
与trustAllCerts
完全相同。
答案 2 :(得分:0)
即使证书非常有效,我也遇到了类似的问题。该系统在jdk 1.7上运行,当我将jdk升级到1.8时,问题已解决。
每个人的情况可能都不一样。