Java如何使用SSLContext請求https鏈接
使用SSLContext請求https鏈接
先了解幾個關鍵類
SSLContext
安全套接字協(xié)議的實現核心類SSLSocket
擴展自Socket用戶客戶端SSLSocketFactory
工廠類SSLServerSocket
擴展自ServerSocket用于服務端SSLServerSocketFactory
SSLServerSocket的工廠KeyStore
密鑰證書KeyManager
密鑰管理器TrustManager
信任管理器X590TrustedManager
TrustManager的子接口,管理X509證書,驗證遠程鏈接
核心代碼
如下:
//首先自己實現信任管理器類,創(chuàng)建一個X509TrustManager對象 X509TrustManager x509m = new X509TrustManager() { //返回受信任的X509證書數組 @Override public X509Certificate[] getAcceptedIssuers() { return null; } //檢查服務器的證書,若不信任該證書拋出異常,可以不檢查默認都信任 @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } //檢查客戶端證書,若不信任該證書拋出異常,咱們自己就是客戶端不用檢查 @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }; // 獲取一個SSLContext實例,核心對象 SSLContext s = SSLContext.getInstance("SSL"); // 初始化SSLContext.init(可以導入的證書,信任管理器,SecureRandom) 三個參數都可為null,沒有證書填寫null就行 s.init(null, new TrustManager[] { x509m }, new java.security.SecureRandom()); //獲取SSLSocket 用于通信 SSLSocketFactory factory = s.getSocketFactory(); SSLSocket s = (SSLSocket) factory.createSocket("localhost", port); //獲取輸入輸出流 OutputStream output = s.getOutputStream(); InputStream input = s.getInputStream(); //發(fā)送數據 DataOutputStream out = new DataOutputStream(output); out.writeBytes("測試發(fā)送數據"); out.flush(); out.close(); //接收數據 Reader reader = new InputStreamReader(input, "UTF-8"); BufferedReader bufferedReader = new BufferedReader(reader); String str = null; StringBuffer sb = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { sb.append(str); } reader.close(); System.out.println(sb.toString()); //打印返回的數據
這就是Java最原始的使用SSLContext創(chuàng)建SSLSocket發(fā)送https請求。
如果使用框架如okhttp httpclient 底層已經實現https請求,CA機構頒發(fā)的證書或者權威機構頒發(fā)的證書都是直接信任的 直接使用即可不需要再重寫任何代碼,網上的好多文章說的都有點問題,我已經親測可用,對于自己生成的證書的https服務才需要另外配置SSLContext這套代碼。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Springmvc 4.x利用@ResponseBody返回Json數據的方法
這篇文章主要介紹了Springmvc 4.x利用@ResponseBody返回Json數據的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04JDK多版本共存并自由切換的操作指南(本文為JDK8和JDK17)
本文介紹了如何在Windows系統(tǒng)上配置多版本JDK(以JDK8和JDK17為例),并通過圖文結合的方式給大家講解了詳細步驟,具有一定的參考價值,需要的朋友可以參考下2025-03-03關于@ResponseBody 默認輸出的誤區(qū)的解答
這篇文章主要介紹了關于@ResponseBody 默認輸出的誤區(qū)的解答,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04java之scan.next()與scan.nextline()函數的使用及區(qū)別
這篇文章主要介紹了java之scan.next()與scan.nextline()函數的使用及區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04