SSLException異常解讀與解決
阿新 • • 發佈:2019-01-07
在讀取一個比較有影響力的網站的API的時候,由於對方採用的是HTTPS的連結,而不是HTTP的連結,所以導致瞭如下的問題:
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
原本以為兩者是一樣的訪問方式,所以出錯主要還是在於自己,當然在沒找到原因之前並沒有向這個方面去想,這也是後來才意識到的。概念與理解
HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象識別符號體系),句法類同 http:體系。用於安全的HTTP資料傳輸。https:URL表明它使用了HTTP,但HTTPS存在不同於HTTP的預設埠及一個加密/身份驗證層(在HTTP與TCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器Netscape Navigator中,提供了身份驗證與加密通訊方法。現在它被廣泛用於全球資訊網上安全敏感的通訊,例如交易支付方面。--百度百科
個人的理解是:這個HTTPS本質上還是基於TCP/IP協議的,但是又加入了一個為了安全起見的SSL,這個SSL主要的作用在於安全,對傳輸過程中的資料進行加密。提供一個身份驗證和密碼通訊的方法。
HTTPS和HTTP的區別主要為以下四點:
解決方案
HttpUtils中:public static String getData(String url) { CloseableHttpClient client = SSLUtils.createSSLClientDefault(); HttpGet getMethod = new HttpGet(); try { getMethod.setURI(new URI(url)); HttpResponse response = client.execute(getMethod); HttpEntity entity = response.getEntity(); String data = EntityUtils.toString(entity); return data; } catch (Exception e) { log.error("HttpUtilsError"); } return ""; }
SSLUtils類
public static CloseableHttpClient createSSLClientDefault() {
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
// 信任所有
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) {
return true;
}
}).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (KeyManagementException e) {
log.error("SSLUtilsErrorKetManage");
} catch (NoSuchAlgorithmException e) {
log.error("SSLUtilsErrorNOAlgorithm");
} catch (KeyStoreException e) {
log.error("SSLUtilsErrorKeyStore");
}
return HttpClients.createDefault();
}