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 項目是否確實采用了國密算法進行通信。
以上就是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-06springboot2+es7使用RestHighLevelClient的示例代碼
本文主要介紹了springboot2+es7使用RestHighLevelClient的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Java微信公眾平臺開發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第九步,關(guān)鍵字回復(fù)以及客服接口實現(xiàn),以及遇到該公眾號暫時無法提供服務(wù)的解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04eclipse實現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06