前言
解决接口或页面仅密信浏览器(或 360 国密浏览器)能访问的问题
测试页面
测试网站-中国银行:https://ebssec.boc.cn/boc15/help.html
- 使用其他浏览器(google,edge等)打开
- 使用密信浏览器打开
解决方案
如果你想在 Java 中简单地发起使用国密(GM/T)算法的 HTTPS 请求,推荐直接使用 阿里云开源的 gm-jsse。它封装成一个 Maven 包,使用方式极其简洁,只需引入依赖即可:
<dependency><groupId>com.aliyun</groupId><artifactId>gmsse</artifactId><version>1.3.1</version>
</dependency>
然后在代码中用它来初始化 SSLContext – 一行即可启用国密套件:
package com.example.sm4;import cn.hutool.core.date.DateUtil;
import cn.hutool.crypto.SecureUtil;
import com.aliyun.gmsse.GMProvider;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;@Slf4j
public class GmSSLHttpsClient {private static final String baseUrl = "xxx";public static void main(String[] args) {GmSSLHttpsClient.query();}@SneakyThrowspublic static void query() {GMProvider provider = new GMProvider();SSLContext sc = SSLContext.getInstance("TLS", provider);TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) {}public void checkServerTrusted(X509Certificate[] chain, String authType) {}public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}}};sc.init(null, trustAllCerts, new SecureRandom());// 创建HTTPS连接URL url = new URL(baseUrl);HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();// 设置请求方法connection.setRequestMethod("GET");// 时间戳,30分钟有效String timestamp = DateUtil.current() + "";// 签名String data = "xxx" + timestamp;String sign = SecureUtil.md5().digestHex(data);// 设置请求头connection.setRequestProperty("timestamp", timestamp);connection.setRequestProperty("sign", sign);connection.setRequestProperty("Accept", "application/json");log.info("请求url:{}", baseUrl);log.info("请求参数,timestamp:{}", timestamp);log.info("请求参数,sign:{}", sign);connection.setSSLSocketFactory(sc.getSocketFactory());connection.connect();log.info("Cipher Suite: " + connection.getCipherSuite());// 读取响应内容try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {String line;while ((line = reader.readLine()) != null) {log.info("响应参数:{}", line);}}connection.disconnect();}}
这个库支持 SM2/SM3/SM4 等国密算法,SSL/TLS 通信全链路纯 Java 实现,示例:
github.com
国密TLS设计和实现
腾讯Kona国密套件对外开源
更深入说明
- gm-jsse 是 Apache-2.0 开源许可,纯 Java 实现,不依赖 JNI 或底层 C 库,适合快速集成
- 支持国密 HTTPS 的双向认证,只需设置 KeyManager 和 TrustManager 即可完成客户端证书和信任链配置 。
- 如果你想探索更底层或更全面的支持,比如服务端 TLS、证书管理、命令行工具,也可以看看 GmSSL(北京大学团队)附国密SSL实验室
总结推荐
场景 | 推荐库 | 说明 |
---|---|---|
简单的 Java 客户端国密 HTTPS | gm-jsse | 一行代码启用,纯 Java,适合快速用 |
带命令行工具、高度定制和服务端支持 | GmSSL | C/C++ 实现,功能更全面,需 JNI/包构建 |
后续建议
- 在项目中添加 gm-jsse 依赖,写几行代码测试连接即可;
- 如果需要国密服务器的 CA 或双向认证,按照 README 中的示例补 TrustManager/KeyManager;
- 想更深入定制或者做服务端,也可以考虑 GmSSL Java 绑定。
源码
https://gitee.com/zhaomingjian/workspace_luoan_demo/tree/master/spring-boot-sm4