1. 程式人生 > >SSLException異常解讀與解決

SSLException異常解讀與解決

在讀取一個比較有影響力的網站的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的區別主要為以下四點:

一、https協議需要到ca申請證書,一般免費證書很少,需要交費。二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。三、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。四、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比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();
	}