Tôi đang gặp sự cố khi tương tác với trang web HTTPS qua Java. Chương trình của tôi sử dụng một URL có chứng chỉ không đáng tin cậy mỗi khi chương trình chạy. Chương trình này phải chạy trên nhiều hệ thống. Hiện nay, tôi có như sau:Chấp nhận chứng chỉ trong Java
public class A{
HostnameVerifier hv = new HostnameVerifier(){
public boolean verify(String urlHostName, SSLSession session){
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
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 = null;
try {
sc = javax.net.ssl.SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
try {
sc.init(null, trustAllCerts, null);
} catch (KeyManagementException e) {
e.printStackTrace();
}
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager{
public java.security.cert.X509Certificate[] getAcceptedIssuers(){
return null;
}
public boolean isServerTrusted(java.security.cert.X509Certificate[] certs){
return true;
}
public boolean isClientTrusted(java.security.cert.X509Certificate[] certs){
return true;
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{
return;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{
return;
}
}
Với mã này, tôi có thể thực hiện như sau tốt:
URL url = new URL(urlString);
URLConnection cnx = url.openConnection();
cnx.connect();
InputStream ins = cnx.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
String curline;
while((curline = in.readLine()) != null) {
System.out.println(curline);
}
Tuy nhiên, tôi không thể làm như sau:
httpClient = new HttpClient();
PostMethod postMethod = null;
int intResult = 0;
postMethod = new PostMethod(authURL);
Enumeration emParams = authParams.propertyNames();
while (emParams.hasMoreElements()) {
String paramName = (String) emParams.nextElement();
String paramValue = authParams.getProperty(paramName);
postMethod.addParameter(paramName, paramValue);
}
intResult = httpClient.executeMethod(postMethod);
postMethod.releaseConnection();
ins.close();
Khi executeMethod (postMethod) được thực hiện, tôi nhận được một SSLHandshakeException, CertPathBuilderException, và như vậy.
Tôi có thể làm gì để khắc phục vấn đề này? Tôi đang nghĩ đến việc chấp nhận chứng chỉ hoặc chỉ bỏ qua tất cả xác nhận chứng chỉ (khi chương trình chạy trong nội bộ trong một mạng riêng).
Cảm ơn
Bạn có sử dụng Apache HttpClient 3.x (hoặc 4)? – Bruno