前言
解决接口或页面仅密信浏览器(或 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();
}
@SneakyThrows
public 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