在读取一个比较有影响力的网站的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的区别主要为以下四点:
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 ""; }
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(); }