在进行RESTful调用时获取SSLException

时间:2015-02-25 11:10:08

标签: java web-services rest

我的机器上正在运行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)

3 个答案:

答案 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时,问题已解决。

每个人的情况可能都不一样。