> 技术文档 > Java + 阿里云 Gmsse 实现 SSL 国密通信

Java + 阿里云 Gmsse 实现 SSL 国密通信


前言

解决接口或页面仅密信浏览器(或 360 国密浏览器)能访问的问题

测试页面

测试网站-中国银行:https://ebssec.boc.cn/boc15/help.html

  • 使用其他浏览器(google,edge等)打开
    Java + 阿里云 Gmsse 实现 SSL 国密通信
  • 使用密信浏览器打开
    Java + 阿里云 Gmsse 实现 SSL 国密通信

解决方案

如果你想在 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;@Slf4jpublic 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