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

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

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

報(bào)錯(cuò)原因

一般出現(xiàn)這種問題是因?yàn)槟繕?biāo)服務(wù)器的證書問題, 證書的 Subject Alternative Names 字段中沒有包含客戶端所使用的連接地址(這里是 IP 地址)

一般建議不要使用IP地址來(lái)進(jìn)行鏈接,如果實(shí)在是要用IP地址來(lái)進(jìn)行連接的話,有兩種處理方案:

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

方法二:在程序中進(jìn)行處理,繞過目標(biāo)服務(wù)器的安全驗(yàn)證

下面來(lái)介紹的就是方法二:在程序中繞過服務(wù)器的安全驗(yàn)證

在程序中繞過服務(wù)器的安全驗(yàn)證

以下就是繞過服務(wù)器驗(yàn)證的具體實(shí)現(xiàn)代碼

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) {
		// 測(cè)試?yán)@過主機(jī)驗(yàn)證
		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)建繞過主機(jī)名驗(yàn)證的 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)");

           

            // 設(shè)置 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返回參數(shù):" + sbf);
            reader.close();
            // 斷開連接
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(decodeUnicode(sbf.toString()));
		
	}

    //下面這個(gè)方法是對(duì)輸出的內(nèi)容進(jìn)行編譯,有些接口返回的數(shù)據(jù)在輸出臺(tái)可能會(huì)是亂碼展示
    //這個(gè)時(shí)候在什么方法都無(wú)用的情況下,可以通過這個(gè)方法將亂碼重新編譯成正確的展示
	    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;
	    }
	

}

注意點(diǎn)

在上面這串代碼中,有一些需要注意的一點(diǎn)就是在設(shè)置繞過驗(yàn)證的時(shí)候一定要注意設(shè)置的是對(duì)當(dāng)前實(shí)例繞過還是全部都繞過,稍微有點(diǎn)不注意,設(shè)置成了全局的話,那么整個(gè)項(xiàng)目所有的鏈接都會(huì)收到相應(yīng)的影響,所以這里一定要注意注意再注意

HttpsURLConnection.setDefaultHostnameVerifier-----全局設(shè)置

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

connection.setHostnameVerifier(allHostsValid);-------設(shè)置對(duì)當(dāng)前實(shí)例的

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

最后多說(shuō)一句

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

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

相關(guān)文章

  • Java開啟新線程并傳參方法代碼實(shí)現(xiàn)

    Java開啟新線程并傳參方法代碼實(shí)現(xiàn)

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

    關(guān)于springboot配置文件密文解密方式

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

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

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

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

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

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

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

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

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

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

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

    Java使用itextpdf實(shí)現(xiàn)表單導(dǎo)出為pdf

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

    springmvc集成shiro登錄權(quán)限示例代碼

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

    java實(shí)現(xiàn)冒泡排序算法

    冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。
    2015-04-04

最新評(píng)論

罗平县| 专栏| 东源县| 中宁县| 金昌市| 屯昌县| 定边县| 无棣县| 龙泉市| 喀什市| 镇安县| 安仁县| 海盐县| 卫辉市| 利辛县| 罗田县| 虎林市| 临汾市| 石泉县| 策勒县| 沁源县| 祁东县| 台北市| 河津市| 南郑县| 九江县| 辉南县| 城市| 丹棱县| 思南县| 彝良县| 宝丰县| 承德县| 若尔盖县| 平昌县| 小金县| 东乡| 宁远县| 眉山市| 唐河县| 陇川县|