1. 程式人生 > >jdk1.6 支援 tls1.1 1.2協議 並忽略身份驗證

jdk1.6 支援 tls1.1 1.2協議 並忽略身份驗證

碰到用jdk1.6請求 https介面,介面伺服器配置的用tls1.1,請求是就報 Remote host closed connection during handshake錯誤,百度是說早期的jdk1.6只支援 tls1.0,如果非用jdk1.6需要引入第三方庫,以下是百度的解決辦法,不過有稍微改動一些程式碼,因為百度出來的程式碼請求某些https 會成功 ,但是請求我調的那個介面會出錯,由於百度寫的程式碼在出某些情況下會主動丟擲一個異常,掩蓋掉了真實異常

我的真實異常是java.io.IOException: HTTPS hostname wrong:  should be,

而百度的那份程式碼丟擲的異常只有UnsupportedOperationException,看不出什麼問題。具體處理看下面,程式碼改動的地方我會加註釋

jdk1.6不支援tls1.2協議,jdk1.8預設支援,比較好的解決方案是升級jdk,但是升級jdk風險極大。不能升級jdk的情況下,可以使用如下方式。

引入依賴

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.54</version>
</dependency>

建立協議工廠

複製程式碼
import org.bouncycastle.crypto.tls.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.net.ssl.*; import javax.security.cert.X509Certificate; import java.io.*; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyStore;
import java.security.Principal; import java.security.SecureRandom; import java.security.Security; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateFactory; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; public class TLSSocketConnectionFactory extends SSLSocketFactory { static { if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { Security.addProvider(new BouncyCastleProvider()); } } @Override public Socket createSocket(Socket socket, final String host, int port, boolean arg3) throws IOException { if (socket == null) { socket = new Socket(); } if (!socket.isConnected()) { socket.connect(new InetSocketAddress(host, port)); } final TlsClientProtocol tlsClientProtocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(), new SecureRandom()); return _createSSLSocket(host, tlsClientProtocol); } @Override public String[] getDefaultCipherSuites() { return null; } @Override public String[] getSupportedCipherSuites() { return null; } @Override public Socket createSocket(String host, int port) throws IOException, UnknownHostException { return null; } @Override public Socket createSocket(InetAddress host, int port) throws IOException { return null; } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { return null; } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { return null; } private SSLSocket _createSSLSocket(final String host, final TlsClientProtocol tlsClientProtocol) { return new SSLSocket() { private java.security.cert.Certificate[] peertCerts; @Override public InputStream getInputStream() throws IOException { return tlsClientProtocol.getInputStream(); } @Override public OutputStream getOutputStream() throws IOException { return tlsClientProtocol.getOutputStream(); } @Override public synchronized void close() throws IOException { tlsClientProtocol.close(); } @Override public void addHandshakeCompletedListener( HandshakeCompletedListener arg0) { } @Override public boolean getEnableSessionCreation() { return false; } @Override public String[] getEnabledCipherSuites() { return null; } @Override public String[] getEnabledProtocols() { return null; } @Override public boolean getNeedClientAuth() { return false; } @Override public SSLSession getSession() { return new SSLSession() { /*原本這些方法都是直接throw UnsupportedOperationException 導致看不到真實異常*/ @Override public int getApplicationBufferSize() { return 0; } @Override public String getCipherSuite() { return null; } @Override public long getCreationTime() { return 0; } @Override public byte[] getId() { return null; } @Override public long getLastAccessedTime() { return 0; } @Override public java.security.cert.Certificate[] getLocalCertificates() { return null; } @Override public Principal getLocalPrincipal() { return null; } @Override public int getPacketBufferSize() { return 0; } @Override public X509Certificate[] getPeerCertificateChain() throws SSLPeerUnverifiedException { return null; } @Override public java.security.cert.Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException { return peertCerts; } @Override public String getPeerHost() { return null; } @Override public int getPeerPort() { return 0; } @Override public Principal getPeerPrincipal() throws SSLPeerUnverifiedException { return null; } @Override public String getProtocol() { return null; } @Override public SSLSessionContext getSessionContext() { return null; } @Override public Object getValue(String arg0) { return null; } @Override public String[] getValueNames() { return null; } @Override public void invalidate() { return; } @Override public boolean isValid() { return true; } @Override public void putValue(String arg0, Object arg1) { return; } @Override public void removeValue(String arg0) { return; } }; } @Override public String[] getSupportedProtocols() { return null; } @Override public boolean getUseClientMode() { return false; } @Override public boolean getWantClientAuth() { return false; } @Override public void removeHandshakeCompletedListener(HandshakeCompletedListener arg0) { } @Override public void setEnableSessionCreation(boolean arg0) { } @Override public void setEnabledCipherSuites(String[] arg0) { } @Override public void setEnabledProtocols(String[] arg0) { } @Override public void setNeedClientAuth(boolean arg0) { } @Override public void setUseClientMode(boolean arg0) { } @Override public void setWantClientAuth(boolean arg0) { } @Override public String[] getSupportedCipherSuites() { return null; } @Override public void startHandshake() throws IOException { tlsClientProtocol.connect(new DefaultTlsClient() { @SuppressWarnings("unchecked") @Override public Hashtable<Integer, byte[]> getClientExtensions() throws IOException { Hashtable<Integer, byte[]> clientExtensions = super.getClientExtensions(); if (clientExtensions == null) { clientExtensions = new Hashtable<Integer, byte[]>(); } //Add host_name byte[] host_name = host.getBytes(); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final DataOutputStream dos = new DataOutputStream(baos); dos.writeShort(host_name.length + 3); dos.writeByte(0); dos.writeShort(host_name.length); dos.write(host_name); dos.close(); clientExtensions.put(ExtensionType.server_name, baos.toByteArray()); return clientExtensions; } @Override public TlsAuthentication getAuthentication() throws IOException { return new TlsAuthentication() { @Override public void notifyServerCertificate(Certificate serverCertificate) throws IOException { try { KeyStore ks = _loadKeyStore(); CertificateFactory cf = CertificateFactory.getInstance("X.509"); List<java.security.cert.Certificate> certs = new LinkedList<java.security.cert.Certificate>(); boolean trustedCertificate = false; for ( org.bouncycastle.asn1.x509.Certificate c : serverCertificate.getCertificateList()) { java.security.cert.Certificate cert = cf.generateCertificate(new ByteArrayInputStream(c.getEncoded())); certs.add(cert); String alias = ks.getCertificateAlias(cert); if(alias != null) { if (cert instanceof java.security.cert.X509Certificate) { try { ( (java.security.cert.X509Certificate) cert).checkValidity(); trustedCertificate = true; } catch(CertificateExpiredException cee) { // Accept all the certs! } } } else { // Accept all the certs! } } if (!trustedCertificate) { // Accept all the certs! } peertCerts = certs.toArray(new java.security.cert.Certificate[0]); } catch (Exception ex) { ex.printStackTrace(); throw new IOException(ex); } } @Override public TlsCredentials getClientCredentials(CertificateRequest certificateRequest) throws IOException { return null; } private KeyStore _loadKeyStore() throws Exception { FileInputStream trustStoreFis = null; try { KeyStore localKeyStore = null; String trustStoreType = System.getProperty("javax.net.ssl.trustStoreType")!=null?System.getProperty("javax.net.ssl.trustStoreType"):KeyStore.getDefaultType(); String trustStoreProvider = System.getProperty("javax.net.ssl.trustStoreProvider")!=null?System.getProperty("javax.net.ssl.trustStoreProvider"):""; if (trustStoreType.length() != 0) { if (trustStoreProvider.length() == 0) { localKeyStore = KeyStore.getInstance(trustStoreType); } else { localKeyStore = KeyStore.getInstance(trustStoreType, trustStoreProvider); } char[] keyStorePass = null; String str5 = System.getProperty("javax.net.ssl.trustStorePassword")!=null?System.getProperty("javax.net.ssl.trustStorePassword"):""; if (str5.length() != 0) { keyStorePass = str5.toCharArray(); } localKeyStore.load(trustStoreFis, keyStorePass); if (keyStorePass != null) { for (int i = 0; i < keyStorePass.length; i++) { keyStorePass[i] = 0; } } } return localKeyStore; } finally { if (trustStoreFis != null) { trustStoreFis.close(); } } } }; } }); } // startHandshake }; } }

表單提交請求

public static String httpsPostData(String urlPath, Map<String, String> data)
{
    String result = null;
URL url = null;
HttpsURLConnection httpurlconnection = null;
BufferedReader reader = null;
    try
{
        url = new URL(urlPath);
httpurlconnection = (HttpsURLConnection) url.openConnection();
httpurlconnection.setSSLSocketFactory(new TLSSocketConnectionFactory());
httpurlconnection.setDoInput(true);
httpurlconnection.setDoOutput(true);
httpurlconnection.setRequestMethod("POST");
   /*用於解決請求我要調的介面的報錯問題,如果這個去掉可以正常請求可以不要這段話*/
   httpurlconnection.setHostnameVerifier(new HostnameVerifier(){
        @Override
public boolean verify(String hostname, SSLSession session) {
          // 直接返回true
return true;
}
   });
httpurlconnection.connect();StringBuffer params = new StringBuffer();// 表單引數與get形式一樣for (Map.Entry<String, String> entry : data.entrySet()) { params.append(entry.getKey()).append("=").append(entry.getValue()).append("&");} params.deleteCharAt(params.length()-1); byte[] bypes = params.toString().getBytes();httpurlconnection.getOutputStream().write(bypes);// 輸入引數int code = httpurlconnection.getResponseCode(); if (code == 200) { // 讀取響應 // int length = (int) httpurlconnection.getContentLength();// // 獲取長度InputStream is = httpurlconnection.getInputStream();reader = new BufferedReader(new InputStreamReader(is));String line = reader.readLine();StringBuilder builder = new StringBuilder(); while (line != null) { builder.append(line);line = reader.readLine();} result = builder.toString();} else{ // TODO} } catch (Exception e) { e.printStackTrace();} finally{ url = null; if (httpurlconnection != null) { httpurlconnection.disconnect();} try{ if (reader != null) { reader.close();} } catch (IOException e) { // TODO} } return result;}

相關推薦

jdk1.6 支援 tls1.1 1.2協議 忽略身份驗證

碰到用jdk1.6請求 https介面,介面伺服器配置的用tls1.1,請求是就報 Remote host closed connection during handshake錯誤,百度是說早期的jdk1.6只支援 tls1.0,如果非用jdk1.6需要引入第三方庫,以下是百

在C 中解決動態計算表達式的問題 如字符串 Sin 1 +Cos 2 執行得出結果

翻譯 tro res min dsm ram 文件 edit 很好 分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net 前一陣公司老總要求我去重構一個同事

VSCode+.Net Core 2.0 WebAPI JWT身份驗證

一、使用VSCode 建立WebApi 1、在官網下載 VSCode以及dotnet-sdk-2.1的安裝包(本人為windows64) 2、安裝包安裝完成後,啟動VSCode,使用dotnet 命令 dotnet new webapi 建立一個webAPi專案 二、a

解決JDK1.7,1.6支援TLS1.2的問題

開發過程中用JDK遇到ssl peer shut down incorrectly這個錯誤,是因為JDK1.8預設是TLS1.2解決辦法:建立一個TLSSocketConnectionFactory,利用這個工具類,再寫相關POST,GET方法就OK了import java.

TensorFlow 1.2正式釋出,新增Python 3.6支援

TensorFlow 1.2.0新版本完美支援Python3.6,windows在cmd中輸入pip install tensorflow就能下載應用最新tensorflow 只需在cmd中輸入pip install tensorflow就能下載應用最新tensorflow

從官網下載jdk1.6 1.7

技術 blog 官網下載 http ima 分享 bsp jdk1.6 下載 從官網下載jdk1.6 1.7

axis2設置soap1.1或soap1.2協議

new 報錯 block client 客戶 12c web 設置 請求 現在Axis、Axis2都是同時支持SOAP1.1和SOAP1.2的。即在服務器端發布一個WebService服務之後,客戶端既可以通過SOAP1.1版本來訪問服務器的服務,也可以通過SOAP1.2版

1郵件 2隊列 3redis 4cache 5基礎控制器 6定時任務 7policy

輔助 nat space tac gpo art 布爾 才會 自動調用 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin

CentOS 6.5 搭建Hadoop 1.2.1集群

nod otn ip地址 maps shuffle 都是 ber 6.5 inux 記錄在64位CentOS 6.5環境下搭建Hadoop 2.5.2集群的步驟,同時遇到問題的解決辦法,這些記錄都僅供參考! 1、操作系統環境配置 1.1、操作系統環境 主機名 IP地址

http協議不同版本之間的對比(1.0 1.1 2.0)

http區別 http 1.0 短連接每一個請求建立一個TCP連接,請求完成後立馬斷開連接。這將會導致2個問題:連接無法復用,head of line blocking連接無法復用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對文件類大請求影響較大。head of lin

給jdk寫註釋系列之jdk1.6容器(1):ArrayList源碼解析

clone correct size 訪問 隨著 interface 指定 程序 最後一個元素 前言: 工作中經常聽到別人講“容器”,各種各樣的容器,話說到底什麽是容器,通俗的講“容器就是用來裝東西的器皿,比如:水桶就是用來盛水的,水桶就是一個容器。” ok,在我們寫程序的

博客作業(12,4,6,7)

課本 發展 精確 必須 國足 font 是不是 log 動手 此作業的要求參見[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2101] 1. 建博客(1分) 在 cnblogs.com (博客園)建賬號(1分)

如何讓你的服務器對TLS1.21.11.0全支持

system ntc 方法 要求 request toc window 分享 1.2 微信小程序的wx.request要求HTTPS 服務器的 TLS 版本必須支持1.2及以下版本,一般就是1.0、1.1、1.2要同時支持這三個版本,一個也不能少,要不然就會出現wx.req

Oracle 12.1.0.2 對JSON的支援

Oracle 12.1.0.2版本有一個新功能就是可以儲存、查詢、索引JSON資料格式,而且也實現了使用SQL語句來解析JSON,非常方便。JSON資料在資料庫中以VARCHAR2, CLOB或者BLOB進行儲存。Oracle建議使用者在插入JSON資料之前,使用is_json來驗證輸入JSO

github不支援tls1.1導致egit cannot open git-upload-pack

【前言】 本文可以當小說看,懸疑小說。 【起因】 過年後開始上班,大概是2.22開始上班,到昨天2.25發現問題, myeclipse的egit不能clone和pull github上的專案了。 報錯資訊cannot open git-upload-pack, 2.25的時候

u-boot-1.1.6 設定新分割槽支援裝置樹

在u-boot命令列執行mtaparts命令 mini2440 :> mtdparts device nand0 <smdk2440-0>, # parts = 4 #: name               

Hollong 低功耗藍芽4.0/4.1/4.2 BLE Sniffer協議分析儀

名稱:緯圖Hollong BLE藍芽 監控分析儀 品牌:ViewTool/緯圖 型號:VTH201A 典型應用: - 抓取BLE藍芽傳輸資料,分析資料傳輸協議; - 實時捕獲、顯示、分析、過濾協議資料,減少除錯時間,加速產品進入市場; - 協助開發除錯BLE相關

Hollong 藍芽4.0/4.1/4.2 BLE協議監控分析儀

品牌:ViewTool/緯圖型號:VTH201A   典型應用: - 抓取BLE藍芽傳輸資料,分析資料傳輸協議; - 協助開發除錯BLE相關軟體,韌體; - 實時捕獲、顯示、解析、過濾和偵測協議錯誤,減少除錯時間,加速產品進入市場; - 幫助學習BLE藍芽傳輸協議; &nb

4.1.6 Grundy數-硬幣遊戲2

Problem Description:   Alice 和 Bob 在玩一個遊戲。給定 k 個數字 a1,a2,……,ak。一開始,有n堆硬幣,每堆各有 Xi 枚硬幣。Alice 和 Bob 輪流選出一堆硬幣,從中取出一些硬幣。每次所選硬幣的枚數一定要在 a1,a2,……,ak 當中。Alice先取,取光

spark-2.2.0-bin-2.6.0-cdh5.12.1.tgz 編譯方法總結!

菜雞一隻,如果有說錯的地方,還請見諒和指出批評!! 事情是這樣的,想在自己本地部署一個hadoop2.6.0-cdh5.12.1,hive1.1.0-cdh5.12.1,spark-2.2.0-bin-2.6.0-cdh5.12.1的環境,前兩個還是很好找到哪裡下載和部署的! c