最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javax.net.ssl.SSLHandshakeException:異常原因及解決方案

 更新時間:2025年06月17日 11:25:02   作者:CXYCMY  
javax.net.ssl.SSLHandshakeException是一個SSL握手異常,通常在建立SSL連接時發(fā)生,這篇文章主要介紹了javax.net.ssl.SSLHandshakeException:異常原因及解決方案,需要的朋友可以參考下

報錯原因

一般出現這種問題是因為目標服務器的證書問題, 證書的 Subject Alternative Names 字段中沒有包含客戶端所使用的連接地址(這里是 IP 地址)

一般建議不要使用IP地址來進行鏈接,如果實在是要用IP地址來進行連接的話,有兩種處理方案:

方法一:可以將IP地址加入到服務器證書的 Subject Alternative Names 字段中;

方法二:在程序中進行處理,繞過目標服務器的安全驗證

下面來介紹的就是方法二:在程序中繞過服務器的安全驗證

在程序中繞過服務器的安全驗證

以下就是繞過服務器驗證的具體實現代碼

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.SecureRandom;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


/**
 * @author cbcbcb
 *
 */
public class Test {

	public static void main(String[] args) {
		// 測試繞過主機驗證
		String pathUrl ="https://IP:PORT/api/test";
		String json = "{\"name\":\"ccc\"}";
		StringBuffer sbf = new StringBuffer();
        try {
            // 創(chuàng)建信任所有證書的 TrustManager
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }

                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
                        }

                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };

            // 創(chuàng)建 SSLContext 并初始化
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new SecureRandom());

            // 獲取 SSLSocketFactory
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            // 創(chuàng)建繞過主機名驗證的 HostnameVerifier
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };

            URL urlx = new URL(pathUrl);
            HttpsURLConnection connection = (HttpsURLConnection) urlx.openConnection();
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.addRequestProperty("Content-Type", "application/json");
            connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

           

            // 設置 SSLSocketFactory 和 HostnameVerifier
            connection.setSSLSocketFactory(ssf);
            connection.setHostnameVerifier(allHostsValid);

            connection.connect();
            DataOutputStream out = new DataOutputStream(connection.getOutputStream());

            if (!"".equals(json)) {
                out.write(json.getBytes());
            }
            out.flush();
            out.close();

            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String lines;
            while ((lines = reader.readLine()) != null) {
                lines = new String(lines.getBytes(), "UTF-8");
                sbf.append(lines);
            }
//             System.out.println("crm返回參數:" + sbf);
            reader.close();
            // 斷開連接
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(decodeUnicode(sbf.toString()));
		
	}

    //下面這個方法是對輸出的內容進行編譯,有些接口返回的數據在輸出臺可能會是亂碼展示
    //這個時候在什么方法都無用的情況下,可以通過這個方法將亂碼重新編譯成正確的展示
	    public static String decodeUnicode(String str) {
	        Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
	        Matcher matcher = pattern.matcher(str);
	        char ch;
	        while (matcher.find()) {
	            ch = (char) Integer.parseInt(matcher.group(2), 16);
	            str = str.replace(matcher.group(1), ch + "");
	        }
	        return str;
	    }
	

}

注意點

在上面這串代碼中,有一些需要注意的一點就是在設置繞過驗證的時候一定要注意設置的是對當前實例繞過還是全部都繞過,稍微有點不注意,設置成了全局的話,那么整個項目所有的鏈接都會收到相應的影響,所以這里一定要注意注意再注意

HttpsURLConnection.setDefaultHostnameVerifier-----全局設置

//全局設置
HostnameVerifier allHostsValid = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;           
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

connection.setHostnameVerifier(allHostsValid);-------設置對當前實例的

// 創(chuàng)建繞過主機名驗證的 HostnameVerifier
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
 connection.setHostnameVerifier(allHostsValid);

最后多說一句

如果不好把控這個代碼究竟有沒有用的話,可以先不要更新到正式環(huán)境,先在本地或者測試服務器嘗試一下在更新

到此這篇關于javax.net.ssl.SSLHandshakeException:異常原因及解決方案的文章就介紹到這了,更多相關javax.net.ssl.SSLHandshakeException:異常內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java開啟新線程并傳參方法代碼實現

    Java開啟新線程并傳參方法代碼實現

    這篇文章主要介紹了Java開啟新線程并傳參方法代碼實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 關于springboot配置文件密文解密方式

    關于springboot配置文件密文解密方式

    這篇文章主要介紹了關于springboot配置文件密文解密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • springboot自定義yml配置文件及其外部部署過程

    springboot自定義yml配置文件及其外部部署過程

    這篇文章主要介紹了springboot自定義yml配置文件及其外部部署過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解

    淺談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解

    下面小編就為大家?guī)硪黄獪\談virtual、abstract方法和靜態(tài)方法、靜態(tài)變量理解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • java中實現創(chuàng)建目錄與創(chuàng)建文件的操作實例

    java中實現創(chuàng)建目錄與創(chuàng)建文件的操作實例

    用Java創(chuàng)建文件或目錄非常簡單,下面這篇文章主要給大家介紹了關于java中實現創(chuàng)建目錄與創(chuàng)建文件的操作實例,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 使用java的注解(用在java類的方法上的注解)方法

    使用java的注解(用在java類的方法上的注解)方法

    這篇文章主要介紹了使用java的注解(用在java類的方法上的注解)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • java?線程池如何執(zhí)行策略又拒絕哪些策略

    java?線程池如何執(zhí)行策略又拒絕哪些策略

    這篇文章主要介紹了java?線程池如何執(zhí)行策略又拒絕哪些策略,文章通過線程池的執(zhí)行方法?execute()?展開全篇內容,需要的小伙伴可以參考一下
    2022-05-05
  • Java使用itextpdf實現表單導出為pdf

    Java使用itextpdf實現表單導出為pdf

    這篇文章主要為大家詳細介紹了Java如何使用itextpdf實現form表單導出為pdf,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-06-06
  • springmvc集成shiro登錄權限示例代碼

    springmvc集成shiro登錄權限示例代碼

    本篇文章主要介紹了springmvc集成shiro登錄權限示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • java實現冒泡排序算法

    java實現冒泡排序算法

    冒泡排序(Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
    2015-04-04

最新評論

廊坊市| 齐河县| 天峻县| 莆田市| 晋州市| 曲沃县| 晋城| 黎城县| 响水县| 高安市| 龙州县| 江永县| 通山县| 常山县| 莎车县| 海晏县| 武城县| 永昌县| 永丰县| 根河市| 青河县| 桃源县| 合水县| 紫阳县| 萍乡市| 边坝县| 会昌县| 绥江县| 米林县| 日喀则市| 通化县| 三亚市| 南充市| 卢湾区| 杭锦后旗| 烟台市| 柳州市| 米林县| 江口县| 滕州市| 清水河县|