https說明

????????http是無狀態的,https是在http應用層協議和tcp傳輸控制層之間加了一層,主要功能包括加密傳輸內容,校驗信息是否完整,信息是否被篡改等。http的網絡傳輸,源端應用層發送http請求,傳輸到源端的控制層,網絡層,物理層->到對方的物理層->網絡層->傳輸控制層->應用層,https就是在兩邊的控制層和應用層之間加了一層SSL/TLS協議層。發送時將http的明文加密,接收時解密,校驗是否完整,是否被篡改,在正確無誤的明文發送給目標端的應用層,作為http報文。

發送方:應用層http明文->SSL/TLS->秘文->控制層 接收方:控制層秘文->SSL/TLS->明文-應用層http

加密方式,分為對稱加密,非對稱加密;對稱加密,加密強度弱,耗時短,使用相同的key加解密;非對稱加密,加密強度高,耗時長,一個使用公鑰,一個使用私鑰。

tls握手流程:

步驟一:tls握手和密鑰交換(非對稱加密階段)

1.客戶端發送自己tls版本,支持的加密方式,隨機數

2.服務器回復選擇的加密方式,隨機數和證書,證書包括認證機構,服務器地址,公鑰,有效期等

3.客戶端驗證證書。查看證書的公鑰,服務器地址,過期時間ca簽名等

4.客戶端生成一個用于對數據加密的對稱密鑰,并用服務器的公鑰將這個對稱密鑰加密,傳輸給服務器

5.服務器用私鑰解密,獲取到對稱密鑰。

步驟二:數據傳輸,對稱加密階段

每次發送數據,使用對稱密鑰對數據進行加密,服務器解密后傳輸給應用層。再將引用層的響應信息加密發送給客戶端。

java發送https請求需要怎么做

1.生產環境必須使用權威CA頒發的證書,禁止信任所有證書。

2.自簽名證書僅限測試環境,生產環境使用會到安全風險。

3.導入證書到JVM信任庫

通過keytool將CA證書導入JVM默認信任庫cacerts:

keytool -import -alias server_cert -file server.crt -keystore $JAVA_HOME/lib/security/cacerts

輸入默認密碼changeit,完成后重啟應用生效。

若需要隔離應用證書,可創建獨立的信任庫:

keytool -import -alias my_ca -file ca.crt -keystore /path/to/my_truststore.jks
?
#啟動時指定JVM參數:
-Djavax.net.ssl.trustStore=/path/to/my_truststore.jks -Djavax.net.ssl.trustStorePassword=your_password
```[6,8](@ref)
https請求實現方式:

1.使用JAVA標準庫

import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
?
public class HttpsExample {public static void main(String[] args) throws Exception {URL url = new URL("https://api.example.com/data");HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setRequestMethod("GET");
?// 驗證響應try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {String line;while ((line = in.readLine()) != null) {System.out.println(line);}}}
}

2.使用Apache HttpClient(推薦)

#maven依賴
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
?
public class HttpClientExample {public static void main(String[] args) throws Exception {// 加載信任庫(可選,默認使用JVM信任庫)SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, (chain, authType) -> true) // 生產環境需替換為證書驗證邏輯.build();
?try (CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build()) {HttpGet httpGet = new HttpGet("https://api.example.com/data");HttpResponse response = httpClient.execute(httpGet);String result = EntityUtils.toString(response.getEntity());System.out.println(result);}}
}

3.使用OkHttp(高性能首選)

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.11.0</version>
</dependency>
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
?
public class OkHttpExample {public static void main(String[] args) throws Exception {OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory(), trustManager) // 生產環境需配置真實TrustManager.build();
?Request request = new Request.Builder().url("https://api.example.com/data").build();
?try (Response response = client.newCall(request).execute()) {System.out.println(response.body().string());}}
}
為什么客戶端需要安裝CA證書?

1.驗證服務器身份(核心作用)

  • 服務器證書的合法性驗證:當客戶端(java程序)訪問HTTPS服務器時,服務器會返回它的數字證書,客戶端需要使用CA證書驗證服務器證書是否由可信結構簽發,是否被篡改,域名是否匹配等。

2.信任鏈的建立

  • 證書鏈驗證:服務器證書通常由中間CA簽發,而中間CA的合法性需由根CA證書驗證。java默認信任庫(cacerts)內置了權威CA的根證書,用于逐級驗證整個證書鏈。

  • 未安裝CA證書的后果:若服務器證書的簽發CA不在客戶端信任庫中,Java會拋出異常,拒接鏈接。

開發環境與生產環境為什么不同?

1.開發環境:開發測試時使用自簽名證書(非CA簽發),瀏覽器或Java默認不信任此類證書。

驗證方式:

1.忽略驗證(僅限測試):通過自定義TrustManager跳過證書檢查(高風險,生產禁用)

2.手動導入信任庫:將自簽名證書導入JVM的cacerts文件,使java臨時信任該證書。

keytool -import -alias dev_cert -file dev.crt -keystore $JAVA_HOME/lib/security/cacerts

目的:快速測試HTTPS功能,避免頻繁申請CA證書的成本。

2.生產環境:必須使用權威CA(如Let's Encrypt,DigiCert)簽發的證書,確保全局可信

驗證機制:

1.自動信任鏈驗證:依賴JVM內置的cacerts信任庫(含主流CA根證書),無需額外配置。

2.證書生命周期管理:需監控有效期,及時續期,避免服務中斷

生產環境代碼應該如何修改?

####

//替換開發代碼中的跳過驗證部分.loadTrustMaterial(null,(chain,authType)->true)
KeyStore trustStore = KeyStore.getInstance("JKS");
try (InputStream is = new FileInputStream("truststore.jks")) {trustStore.load(is, "truststore_password".toCharArray());
}
?
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, null) // 啟用信任庫驗證.build();
雙向驗證:

若需客戶端證書認證(如銀行接口):

KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(new FileInputStream("client.p12"), "client_pass".toCharArray());
?
SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, "client_pass".toCharArray()) // 加載客戶端證書.loadTrustMaterial(trustStore, null) // 加載信任庫.build();
生產環境完整代碼示例:
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import java.io.FileInputStream;
import java.security.KeyStore;public class ProductionHttpsClient {public static void main(String[] args) throws Exception {// 1. 加載信任庫(生產環境使用CA證書)KeyStore trustStore = KeyStore.getInstance("JKS");try (InputStream is = new FileInputStream("/path/to/truststore.jks")) {trustStore.load(is, "truststore_pass".toCharArray());}// 2. 初始化SSLContext(啟用完整證書驗證)SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, null) // 關鍵修改:啟用CA驗證.build();// 3. 創建HttpClient(使用默認域名校驗)try (CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build()) {// 4. 發送請求HttpGet httpGet = new HttpGet("https://api.example.com/data");try (CloseableHttpResponse response = httpClient.execute(httpGet)) {String result = EntityUtils.toString(response.getEntity());System.out.println(result);}}}
}
生產環境注意事項

1.證書管理

  • 監控CA證書有效期,提前續期(如Let's Encrypt證書90天有效期)

  • 定期更新JVM信任庫(cacerts),確保包含最新根證書。

2.協議與加密套件

  • 強制使用TLSv1.2+,禁用弱算法(如SSLv3,TLSv1.0)

SSLContext sslContext = SSLContext.getInstance("TLSv1.3");

3.異常處理

  • 捕獲SSLHandshakeExceptioni并記錄詳細日志,快速定位證書問題

4.性能開銷

  • 復用CloseableHttpClient實例,減少SSL握手開銷

為什么開發環境不能共用生產的根證書

1.安全漏洞放大
  • 開發環境常使用自簽名證書,若將其導入生產信任庫,攻擊者可通過偽造相同域名的自簽名證書劫持通信

  • 生產根證書被用于開發環境時,測試證書的泄露可能危及生產系統信任鏈

2.證書管理混亂
  • 開發證書頻繁變更:測試需快速迭代,證書常重置或替換,若共用會導致生產信任庫頻繁更新,引發服務中斷

3.驗證策略沖突
  • 開發環境往往需跳過嚴格驗證(如 NoopHostnameVerifier),而生產環境必須啟用完整驗證(域名匹配、證書鏈校驗

  • 共用配置會強制生產環境降低安全標準,或讓開發環境無法調試

4.合規與審計風險
  • 行業標準(如 PCI DSS)要求生產環境證書必須由公共 CA 簽發并獨立管理,共用會導致審計失敗

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909524.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實時操作系統(FreeRTOS、RT-Thread)RISC-V

FreeRTOS&#xff1a;FreeRTOS? - FreeRTOS? RT-Thread&#xff1a;rt-thread.org VxWorks&#xff1a; QNX Neutrino RTOS&#xff1a; RT-Linux&#xff1a; 一、 實時操作系統介紹 實時操作系統&#xff08;Real Time Operating System&#xff0c;簡稱RTOS&#xff…

Python3除標準庫外更全面的XML解析方案

一、擴展解析庫方案 lxml高性能解析 from lxml import etree doc etree.parse(data.xml) # XPath 2.0增強查詢 nodes doc.xpath(//student[score>90]/name/text())優勢&#xff1a;支持XPath 2.0語法和XSLT轉換&#xff0c;比標準庫快5-10倍 BeautifulSoup混合解析 fr…

同時裝兩個MySQL, 我在MySQL5的基礎上, 安裝MySQL8

目錄 1. 前言 2. 下載MySQL 3. 安裝MySQL 3.1 第一步:選擇MySQL ?編輯 3.2 第二步:存儲地址 3.3 第三步 3.4 第四步:完成基礎配置 3.5 第五步 3.6 第六步:數據庫密碼 3.7 第七部:服務名 4. 環境變量 4.1 復制MySQL的bin地址 4.2 進入高級系統設置 4.3 PATH 4.4 更改…

Visual Studio 2022打包程序流程

Visual Studio 2022打包程序流程 打開管理拓展 安裝Microsoft Visual Studio Installer Projects 關閉軟件才能繼續安裝 安裝完成后點擊&#xff0c;解決方案&#xff0c;創建新項目 添加&#xff1a;setup project 打開軟件的路徑 復制路徑 添加文件 粘貼剛才復制的路徑&…

web3方法詳解

web3.py 是一個功能強大的 Python 庫,用于與以太坊區塊鏈交互。它提供了多種模塊和功能,涵蓋賬戶管理、智能合約交互、交易發送、區塊鏈數據查詢等。以下是 web3.py 的主要功能模塊及其用途: 1. Web3 核心模塊 功能:提供基礎連接、工具函數和核心功能。 常用方法: Web3(…

HTML5+JS實現一個簡單的SVG 貝塞爾曲線可視化設計器,通過幾個點移動位置,控制曲線的方向

三次貝塞爾曲線,二次貝塞爾曲線有什么區別 https://blog.csdn.net/xiaoyao961/article/details/148678265 SVG 貝塞爾曲線可視化設計器 下面是一個簡單的貝塞爾曲線可視化設計器&#xff0c;使用 HTML5 和 JavaScript 實現。這個設計器允許你通過拖動控制點來實時調整貝塞爾曲…

Pytorch框架——自動微分和反向傳播

一、自動微分概念 自動微分&#xff08;Automatic Differentiation&#xff0c;AD&#xff09;是一種利用計算機程序自動計算函數導數的技術&#xff0c;它是機器學習和優化算法中的核心工具&#xff08;如神經網絡的梯度下降&#xff09;&#xff0c;通過反向傳播計算并更新梯…

【Linux手冊】進程的狀態:從創建到消亡的“生命百態”

目錄 前言 操作系統進程狀態 運行狀態 阻塞狀態 掛起狀態 Linux中具體的進程狀態 R(running)運行狀態 S(sleeping)阻塞狀態 D(disk sleep)磁盤休眠狀態 T(stopped)和t(tracing stop) X(dead)終止狀態 Z(zombie)僵尸狀態 僵尸進程的危害 前言 我們在運行可執行程序…

李沐--動手學深度學習 LSTM

1.從零開始實現LSTM #從零開始實現長短期記憶網絡 import torch from torch import nn from d2l import torch as d2l#加載時光機器數據集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps)#1.定義和初始化模型參數&#xff…

面經的疑難雜癥

1.介紹一下虛擬地址&#xff0c;虛擬地址是怎么映射到物理地址的&#xff1f; 虛擬地址是指在采用虛擬存儲管理的操作系統中&#xff0c;進程訪問內存時所使用的地址。每個進程都有獨立的虛擬地址空間&#xff0c;虛擬地址通過操作系統和硬件&#xff08;如MMU&#xff0c;內存…

去噪擴散概率模型(DDPM)全解:從數學基礎到實現細節

一、 概述 在這篇博客文章中&#xff0c;我們將深入探討去噪擴散概率模型&#xff08;也被稱為 DDPMs&#xff0c;擴散模型&#xff0c;基于得分的生成模型&#xff0c;或簡稱為自動編碼器&#xff09;&#xff0c;這可以說是AIGC最近幾年飛速發展的基石&#xff0c;如果你想做…

【系統分析師】2011年真題:案例分析-答案及詳解

文章目錄 試題1【問題 1】【問題 2】【問題 3】 試題2【問題 1】【問題 2】【問題 3】 試題3【問題 1】【問題 2】【問題 3】 試題4【問題 1】【問題 2】【問題 3】 試題5【問題 1】【問題 2】【問題 3】 試題1 隨著寬帶應用快速發展&#xff0c;用戶要求系統服務提供商提供基…

【unitrix】 1.7 規范化常量類型結構(standardization.rs)

一、源碼 這段代碼實現了一個二進制數字標準化系統&#xff0c;用于將二進制數字類型&#xff08;B0/B1&#xff09;轉換為更簡潔的表示形式。 //! 二進制數字標準化模塊 / Binary Number Normalization Module //! //! 提供將二進制數字(B0/B1)標準化為更簡潔表示形式的功能…

NJet Portal 應用門戶管理介紹

nginx向云原生演進&#xff0c;All in OpenNJet&#xff01; 1. 應用門戶簡介 NJet 應用引擎是基于 Nginx 的面向互聯網和云原生應用提供的運行時組態服務程序&#xff0c;作為底層引擎&#xff0c;NJet 實現了NGINX 云原生功能增強、安全加固和代碼重構&#xff0c;利用動態加…

uni-app學習筆記三十六--分段式選項卡組件的使用

先來看效果&#xff1a; 上圖有3個選項卡&#xff08;PS:uniapp官方稱之為分段器&#xff0c;我還是習慣叫選項卡&#xff09;&#xff0c;需要實現點擊不同的選項卡時下方切換顯示對應的數據。 下面介紹下實現的過程。 1.在uniapp官方文檔下載并安裝該擴展組件&#xff1a;u…

Qt:Qt桌面程序正常退出注意事項

一般情況下&#xff0c;Qt窗體的創建和顯示命令如下&#xff1a; Main_window main_window; main_window.show(); 主窗體中設置屬性Qt::WA_DeleteOnClose setAttribute(Qt::WA_DeleteOnClose); 則在main.cpp中可以將窗體創建為指針&#xff0c;這樣在退出時可以正確釋放指針…

【arXiv2024】時間序列|TimesFM-ICF:即插即用!時間序列預測新王者!吊打微調!

論文地址&#xff1a;https://arxiv.org/pdf/2410.24087 代碼地址&#xff1a;https://github.com/uctb/TSFM 為了更好地理解時間序列模型的理論與實現&#xff0c;推薦參考UP “ThePPP時間序列” 的教學視頻。該系列內容系統介紹了時間序列相關知識&#xff0c;并提供配套的論…

從0開始學習語言模型--Day02-如何最大化利用硬件

如何利用硬件 這個單元分為內核、并行處理和推理。 內核&#xff08;Kernels&#xff09; 我們說的內核一般指的就是GPU&#xff0c;這是我們用于計算的地方&#xff0c;一般說的計算資源就指的是GPU的大小。我們模型所用的數據和參數一般存儲在內存里&#xff0c;假設把內存…

ElasticSearch配置詳解:設置內存鎖定的好處

什么是內存鎖定 "bootstrap": {"memory_lock": "true" }內存鎖定是指將Elasticsearch的JVM堆內存鎖定在物理內存中&#xff0c;防止操作系統將其交換&#xff08;swap&#xff09;到磁盤。 內存交換是操作系統的虛擬內存管理機制&#xff0c;當…

成功解決 ValueError: Unable to find resource t64.exe in package pip._vendor.distlib

解決問題 我們在本地的命令行中運行指令"python -m pip install --upgrade pip"的時候&#xff0c;報了如下的錯誤&#xff1a; 解決思路 我們需要重新安裝一下pip。 解決方法 步驟1&#xff1a; 通過執行下面的指令刪除本地的pip: python -m pip uninstall pip…