Nếu bạn để ý mỗi khi bạn dùng trình duyệt để kết nối tới một địa chỉ dạng https:// nào đó bạn có thể nhận được thông báo về việc đây là một kết nối không đáng tin, nếu bạn tin tưởng nó thì có thể thêm ngoại lệ này vào trình duyệt. Và đây cũng là ý tưởng để tôi giải quyết vấn đề này, đó là tôi cần phải tìm cách để java sẽ tự động thêm certificate này vào kho lưu trữ của mình hoặc đánh lừa java để nó luôn luôn tin tưởng vào certificate này.
Cách làm như sau:
- Trước khi mở kết nối tôi cho java chạy qua hàm sau:
private static void disableUntrustedComplain(){
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers(){
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType){}
public void checkServerTrusted(X509Certificate[] certs, String authType){}
}
};
try{
SSLContext sc = SSLContext.getInstance("TLS");//SSL nếu sử dụng mã hóa SSL.
sc.init(null, trustAllCerts, new SecureRandom());
SSLContext.setDefault(sc);
System.out.println("disabled");
}catch(Exception e){
e.printStackTrace();
}
} - Hàm này có tác dụng giúp java bỏ qua các complaining về untrusted certificate
- Sau khi chạy hàm này chúng ta có thể thoải mái kết nối tới bất kỳ một kết nối nào sử dụng SSL/TLS.
UPDATE:
Gần đây tôi có làm việc với các kết nối liên quan tới giao thức XMPP (cụ thể là với Openfire) thì thấy cần phải sửa đoạn code trên một chút thì mới chạy được (Lưu ý là chỉ áp dụng với Openfire thôi nhé).
Khi xử lý kết nối với Openfire sử dụng các self-certificate, mặc dù tôi sử dụng hàm ở phía trên nhưng vẫn bị dính lỗi PKIX không tin tưởng certificate. Để xử lý lỗi này tôi làm như sau:
Khi khởi tạo kết nối tới server XMPP tôi thêm thông tin cấu hình như sau:
SSLContext sc = disableUntrustedComplain();Trong đó có một số điểm lưu ý:
ConnectionConfiguration cc = new ConnectionConfiguration("mydomain.com", 5222);
cc.setCustomSSLContext(sc);
XMPPConnection connection = new XMPPTCPConnection(cc);
- Hàm disableUntrustedComplain tôi trả về một giá trị thay vì sử dụng void như ở trên.
Hàm này nội dung sẽ như sau:
private static SSLContext disableUntrustedComplain(){
SSLContext sc = null;
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
//install the all-trusting trust manager
try {
sc = SSLContext.getInstance("TLS");//TLS or SSL
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
SSLContext.setDefault(sc);
System.out.println("disable");
} catch(NoSuchAlgorithmException naex){
naex.printStackTrace();
}catch(KeyManagementException kmex){
kmex.printStackTrace();
}finally{
return sc;
}
}
Không có nhận xét nào:
Đăng nhận xét