SpringBoot實現(xiàn)國密通信的流程步驟
要在兩個 Spring Boot 項目(項目 A 和項目 B)之間通過國密協(xié)議實現(xiàn) HTTPS 通信,我們需要完成以下步驟:
- 生成支持國密的證書。
- 配置兩個 Spring Boot 項目,使用國密證書實現(xiàn) HTTPS。
- 項目 A 使用 RestTemplate 調(diào)用項目 B 的接口,驗證通信是否成功。
1. 生成支持國密的證書
為了使用國密算法,通常需要使用一些支持國密算法的工具來生成證書??梢允褂?OpenSSL 結(jié)合 gmssl 工具,或直接使用專門的工具,例如一些企業(yè)提供的國密證書生成工具。這里假設(shè)我們使用 GMSSL 工具生成證書。
1.1 安裝 GMSSL(如果未安裝)
可以從 GMSSL 的官方 GitHub 倉庫下載并編譯安裝。
1.2 生成 SM2 密鑰對和證書
生成 CA 證書(用于簽發(fā)服務(wù)器和客戶端證書):
gmssl ecparam -genkey -name sm2p256v1 -out ca-key.pem gmssl req -new -x509 -sm3 -key ca-key.pem -out ca-cert.pem -subj "/CN=GM CA"
生成服務(wù)器證書(假設(shè)用于項目 B):
gmssl ecparam -genkey -name sm2p256v1 -out server-key.pem gmssl req -new -key server-key.pem -out server-req.pem -subj "/CN=localhost" gmssl x509 -req -in server-req.pem -sm3 -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem -days 365 -CAcreateserial
生成客戶端證書(假設(shè)用于項目 A):
gmssl ecparam -genkey -name sm2p256v1 -out client-key.pem gmssl req -new -key client-key.pem -out client-req.pem -subj "/CN=localhost" gmssl x509 -req -in client-req.pem -sm3 -CA ca-cert.pem -CAkey ca-key.pem -out client-cert.pem -days 365 -CAcreateserial
將證書和密鑰導(dǎo)出為 PKCS12 格式(供 Spring Boot 項目使用):
- 服務(wù)器端(項目 B):
gmssl pkcs12 -export -in server-cert.pem -inkey server-key.pem -out server-keystore.p12 -name server -CAfile ca-cert.pem -caname root
- 客戶端(項目 A):
gmssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -out client-keystore.p12 -name client -CAfile ca-cert.pem -caname root
2. 配置 Spring Boot 項目使用 HTTPS
2.1 項目 B:提供 HTTPS 接口
- 將 server-keystore.p12 放置在項目 B 的 resources 目錄下。
- 在項目 B 的 application.yml 配置文件中,配置 HTTPS 連接:
server:
port: 8443
ssl:
# server-keystore.p12文件放在工程src/main/resource目錄下
key-store: classpath:server-keystore.p12
key-store-password: changeit # 使用導(dǎo)出時設(shè)置的密碼
key-store-type: PKCS12
key-alias: server
- 創(chuàng)建一個簡單的 HTTPS 端點,供項目 A 調(diào)用:
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello from Project B with GMSSL!";
}
}
2.2 項目 A:使用 HTTPS 調(diào)用項目 B
將
client-keystore.p12放置在項目 A 的resources目錄下。在項目 A 的
application.yml中配置 SSL 證書,以便項目 A 可以信任項目 B 的服務(wù)器證書:
server:
ssl:
# client-keystore.p12文件放在工程src/main/resource目錄下
key-store: classpath:client-keystore.p12
key-store-password: changeit
key-store-type: PKCS12
key-alias: client
配置 RestTemplate,加載客戶端證書并信任項目 B 的證書:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() throws Exception {
SSLContext sslContext = SSLContextBuilder
.create()
.loadKeyMaterial(
new File("src/main/resources/client-keystore.p12"), // 客戶端證書路徑
"changeit".toCharArray(), // KeyStore 密碼
"changeit".toCharArray()) // Key 密碼
// 如果使用的是第三方權(quán)威 CA 簽發(fā)的標(biāo)準(zhǔn)證書(如 DigiCert、GlobalSign、Let's Encrypt 等),通常不需要在客戶端手動配置 CA 證書。因為這些權(quán)威 CA 的根證書已經(jīng)被包含在大多數(shù) JDK 的默認(rèn)信任庫中。省略下面一行
.loadTrustMaterial(new File("src/main/resources/ca-cert.pem"), new TrustSelfSignedStrategy())
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(
HttpClients.custom().setSSLContext(sslContext).build());
return new RestTemplate(requestFactory);
}
}
在項目 A 中調(diào)用項目 B 的 HTTPS 接口:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-hello")
public String callHello() {
String url = "https://localhost:8443/hello"; // 項目 B 的 HTTPS 地址
return restTemplate.getForObject(url, String.class);
}
}
3. 啟動和測試
- 啟動項目 B,然后啟動項目 A。
- 訪問項目 A 的接口
http://localhost:8080/call-hello,它會通過 HTTPS 連接到項目 B。 - 如果配置正確,將看到返回消息:
Hello from Project B with GMSSL!
備注
- 本示例使用的是自簽名證書。在實際生產(chǎn)環(huán)境中,建議使用權(quán)威 CA 簽發(fā)的國密證書。
- 若有客戶端與服務(wù)器證書雙向認(rèn)證的需求,還需要在服務(wù)器端配置
client-auth=need。
如何驗證國密生效
要驗證 A 和 B 項目之間是否采用了國密算法通信,可以通過以下幾種方法來確認(rèn):
1. 檢查證書算法信息
可以查看項目 B 的服務(wù)器證書,確保它確實是基于國密算法生成的(如 SM2 算法)。在 B 項目的 keystore 中找到證書,使用以下命令查看證書的算法:
keytool -list -v -keystore server-keystore.p12 -storepass <password>
在輸出中找到 Signature algorithm 字段,確保它是國密算法(例如 SM2WITHSM3)簽名的。如果服務(wù)器證書使用的是 SM2,則通信時雙方會使用國密的公私鑰來加解密數(shù)據(jù)。
2. 使用抓包工具分析加密算法
使用 Wireshark 等抓包工具可以詳細(xì)檢查 A 和 B 之間的 HTTPS 流量。抓包時,注意觀察 TLS 握手包中的加密算法和密鑰交換算法,確認(rèn)是否包含 SM2、SM3、SM4 等國密算法。
具體步驟:
- 打開 Wireshark 并開始抓包。
- 過濾流量為 HTTPS 或指定 B 項目的 IP 地址。
- 找到 TLS 握手包,查看加密算法的協(xié)商信息,確保包含國密協(xié)議(例如
ECDHE-SM2-WITH-SM4-SM3或其他 SM 系列)。
3. 查看項目啟動日志
有些 SSL/TLS 庫會在握手時輸出所使用的加密算法,檢查 A 和 B 項目的啟動日志或請求日志,有時可以找到所使用的具體加密算法信息。如果配置正確,日志中可能會記錄握手使用的國密算法。
4. 服務(wù)器端代碼調(diào)試驗證
在項目 B 中可以使用調(diào)試代碼來確認(rèn)使用的密鑰對。例如,使用 SSLContext 打印出當(dāng)前會話的加密算法,確保其采用 SM 系列算法:
import javax.net.ssl.SSLSession;
import javax.net.ssl.HttpsURLConnection;
import java.net.URL;
public void checkSSLConnection() throws Exception {
URL url = new URL("https://localhost:8443/hello");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();
SSLSession session = connection.getSession();
System.out.println("Cipher Suite: " + session.getCipherSuite()); // 確認(rèn)是否為 SM 算法
}
通過這些方法,可以更好地驗證 A 和 B 項目是否確實采用了國密算法進(jìn)行通信。
以上就是SpringBoot實現(xiàn)國密通信的流程步驟的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot國密通信的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析
這篇文章主要介紹了Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
springboot2+es7使用RestHighLevelClient的示例代碼
本文主要介紹了springboot2+es7使用RestHighLevelClient的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java微信公眾平臺開發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第九步,關(guān)鍵字回復(fù)以及客服接口實現(xiàn),以及遇到該公眾號暫時無法提供服務(wù)的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Spring中XML schema擴(kuò)展機(jī)制的深入講解
這篇文章主要給大家介紹了關(guān)于Spring中XML schema擴(kuò)展機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
eclipse實現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06

