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

发布于:2025-07-02 ⋅ 阅读:(14) ⋅ 点赞:(0)

前言

解决接口或页面仅密信浏览器(或 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


网站公告

今日签到

点亮在社区的每一天
去签到