เมื่อใดก็ตามที่เราพยายามเชื่อมต่อกับ URL
หากเซิร์ฟเวอร์ที่ไซต์อื่นกำลังทำงานบนโปรโตคอล https และได้รับคำสั่งว่าเราควรสื่อสารผ่านข้อมูลที่ให้ไว้ในใบรับรองเราจะมีตัวเลือกต่อไปนี้:
1) ขอใบรับรอง (ดาวน์โหลดใบรับรอง) นำเข้าใบรับรองนี้ใน Trustore การใช้ java trustore เริ่มต้นสามารถพบได้ใน \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts ดังนั้นหากเราพยายามเชื่อมต่อกับการเชื่อมต่อ URL อีกครั้งจะได้รับการยอมรับ
2) ในกรณีธุรกิจปกติเราอาจเชื่อมต่อกับ URLS ภายในในองค์กรและเรารู้ว่า URL เหล่านี้ถูกต้อง ในกรณีเช่นนี้คุณเชื่อว่าเป็น URL ที่ถูกต้องในกรณีดังกล่าวข้างต้นสามารถใช้รหัสซึ่งจะไม่บังคับให้จัดเก็บใบรับรองเพื่อเชื่อมต่อกับ URL ใด URL หนึ่ง
สำหรับประเด็นที่ 2 เราต้องทำตามขั้นตอนด้านล่าง:
1) เขียนวิธีการด้านล่างซึ่งตั้งค่า HostnameVerifier สำหรับ HttpsURLConnection ซึ่งจะคืนค่าเป็นจริงสำหรับทุกกรณีซึ่งหมายความว่าเราไว้วางใจ trustStore
// trusting all certificate
public void doTrustToCertificates() throws Exception {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
}
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
2) เขียนวิธีการด้านล่างซึ่งเรียกใช้ doTrustToCertificates ก่อนที่จะพยายามเชื่อมต่อกับ URL
// connecting to URL
public void connectToUrl(){
doTrustToCertificates();//
URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
System.out.println("ResponseCode ="+conn.getResponseCode());
}
การโทรนี้จะส่งคืนรหัสตอบกลับ = 200 หมายความว่าการเชื่อมต่อสำเร็จ
สำหรับรายละเอียดเพิ่มเติมและตัวอย่างตัวอย่างคุณสามารถดูURL