2010-09-28 43 views
0

我想創建一個https連接,並且它在測試類中正常工作。但是當我在動作類中調用相同的方法時步驟666666666666.創建https連接時發生java.net.SocketException,javax.net.ssl.DefaultSSLSocketFactory.createSocket

java.net.SocketException異常 在javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:8) 在com.ibm.net.ssl.www2.protocol.https後得到下面的錯誤。 b.afterConnect(b.java:29) at com.ibm.net.ssl.www2.protocol.https.c.connect(c.java:34) at sun.net.www.protocol.http.HttpURLConnection。 getInputStream(HttpURLConnection.java:943) at com.ibm.net.ssl.www2.protoc ol.https.a.getInputStream(a.java:13)

該方法如下。

公共靜態字符串登錄(字符串reqXML){

String responseXml=""; 
    try { 
     JConfigUtil configuratorTest = JConfigUtil.getInstance(); 
     String LogOn_URL = configuratorTest.getProperty(CenturionConst.Centurion,CenturionConst.LogOnService_URL); 
    // System.out.println("Log On URL :"+LogOn_URL); 
     String param = URLEncoder.encode(reqXML,"UTF8"); 
     String inputUrl=LogOn_URL+param; 
     System.out.println("11111111111111111"); 
     System.setProperty("javax.net.ssl.trustStore", CERT_FILE_LOC); 

     System.out.println("22222222222222222"); 

     HostnameVerifier hv = new HostnameVerifier() { 
      public boolean verify(String urlHostName, SSLSession session) { 
       System.out.println("Warning: URL Host: "+urlHostName+" vs. "+session.getPeerHost()); 
       return true; 
      } 
     }; 
     System.out.println("33333333333333333"); 
     HttpsURLConnection.setDefaultHostnameVerifier(hv); 
     System.out.println("444444444444444444"); 
     System.out.println(inputUrl); 
     URL url = new URL(inputUrl); 
     HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); 
     System.out.println("555555555555555555"); 
     connection.setDoOutput(true); 
     System.out.println("6666666666666666666"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     String line; 
     System.out.println("77777777777777777777"); 
     while ((line = in.readLine()) != null) { 
      responseXml=responseXml+line; 
      } 
     in.close(); 
     System.out.println("8888888888888888888888"); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return responseXml; 
} 

回答

0

調用trustAllHttpsCertificates()之前 的HostnameVerifier HV =新的HostnameVerifier(),它會工作

包com.americanexpress.mobl.centurion。 app.util;

import java.security.cert.CertificateException; import java.security.cert.X509Certificate;

公共類MITM實現javax.net.ssl.TrustManager,javax.net.ssl.X509TrustManager {

public void checkClientTrusted(X509Certificate[] certs, String authType) 
     throws CertificateException { 
    // TODO Auto-generated method stub 
    return; 
} 

public void checkServerTrusted(X509Certificate[] certs, String authType) 
     throws CertificateException { 
    // TODO Auto-generated method stub 
    return; 
} 

public X509Certificate[] getAcceptedIssuers() { 
    // TODO Auto-generated method stub 
    return null; 
} 
public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) 
{ 
    return true; 
    } 
public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) 
{ 
    return true; 
    } 

公共靜態無效trustAllHttpsCertificates()拋出異常{ javax.net.ssl.TrustManager [] trustAllCerts = new javax.net.ssl.TrustManager [1]; javax.net.ssl.TrustManager tm = new miTM(); trustAllCerts [0] = tm; javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance(「SSL」); sc.init(null,trustAllCerts,null); javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); }

}