3. 开发环境搭建:安装国密SDK、配置依赖、HelloWorld示例

坦白说,环境搭建这步卡住了不少人。我见过有的团队光装个SDK就折腾了两天,结果发现是JDK版本没对齐。

国密SDK不像那些常见的开源库,拽个坐标就能自动下载。它依赖底层密码芯片、硬件加密卡,或者操作系统的密码学接口。你把SDK装对了,后面才能跑得起来。咱们一步步来。

3.1 支持的操作系统与JDK版本

先看你的项目跑在什么环境上。下面是常用组合,我建议你直接对号入座:

操作系统 JDK版本 国密SDK版本 备注
CentOS 7.6+ / Ubuntu 20.04+ JDK 8(必选) v3.0.2 主流生产环境,选它最稳
麒麟 V10 / 统信 UOS JDK 8 / JDK 11 v3.0.2 国产化信创环境,注意必须用龙芯或鲲鹏架构
Windows Server 2019 JDK 8 v3.0.2 仅推荐开发测试用,生产别用
⚠️ 注意: 我自己在项目里踩过一个坑——JDK版本不能低于1.8.0_202。更低版本缺了AES-GCM的Native加速,国密SM4跑起来会慢一个数量级。如果你用的是JDK 8,请确保大版本在202以上。

3.2 SDK包结构说明

你拿到SDK压缩包后,解压会看到这样的目录:

gm-sdk-3.0.2/
├── lib/
│   ├── gm-sdk-core-3.0.2.jar
│   ├── gm-sdk-pki-3.0.2.jar
│   ├── gm-sdk-crypto-3.0.2.jar
│   └── gm-sdk-native-linux-x86_64-3.0.2.jar
├── deps/
│   ├── bcprov-jdk15on-1.70.jar
│   └── slf4j-api-1.7.36.jar
├── conf/
│   ├── gm-sdk.properties
│   └── security.cfg
├── bin/
│   ├── install.sh
│   └── init.sh
└── docs/
    └── api-reference.html

每个包干啥的,我列清楚:

  • gm-sdk-core:核心引擎,封装了SM2/3/4/ZUC算法。所有加解密、签名、验签都走它。
  • gm-sdk-pki:证书管理,解析国密双证书、处理LDAP证书库。改造存量PKI系统时必用。
  • gm-sdk-crypto:高级密码协议,像SSL握手、TLS1.3国密套件。搞加密通道改造时会用到。
  • gm-sdk-native:通过JNI调用C语言国密库,性能最好。注意它分架构,x86_64和aarch64不能混用。
💡 小窍门: 如果你只是做改造验证,不需要native包也能跑。gm-sdk-core自带纯Java实现,性能也够用。我早期写原型时就是这么干的,省去了适配硬件加密卡的时间。

3.3 把SDK装进项目

配置Maven依赖。我不建议你上传到公司私服——国密SDK有严格的版本管理,最好本地安装或用系统级集成。我个人习惯用install-file命令:

mvn install:install-file \
    -Dfile=lib/gm-sdk-core-3.0.2.jar \
    -DgroupId=com.gm.sdk \
    -DartifactId=gm-sdk-core \
    -Dversion=3.0.2 \
    -Dpackaging=jar

然后在pom.xml里加依赖:

<dependency>
    <groupId>com.gm.sdk</groupId>
    <artifactId>gm-sdk-core</artifactId>
    <version>3.0.2</version>
</dependency>
<!-- 如果要用证书解析,加这个 -->
<dependency>
    <groupId>com.gm.sdk</groupId>
    <artifactId>gm-sdk-pki</artifactId>
    <version>3.0.2</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>

有个细节:bcprov-jdk15on必须得是1.70或更高版本。低版本缺少SM3WithSM2签名的OID,运行时会报NoSuchAlgorithmException。我2019年刚接手国密改造时,就因为pom里引了旧的1.62,查了两天才定位到问题。

⚠️ 避坑指南: 我曾经碰到一个同事,把GM SDK的jar手动拷贝到项目的WEB-INF/lib下,没经过Maven管理。结果运行时依赖版本冲突,jar互相覆盖,SM4解密全挂。所以,请一定要用Maven或Gradle管理,版本号要锁定在父pom里。

3.4 快速编写HelloWorld

环境搭好了,咱们写个最简程序验证一下。你想想看,如果这个例子跑不通,后面所有的改造都白搭。

import com.gm.sdk.core.GMInitializer;
import com.gm.sdk.core.crypto.SM4Engine;
import com.gm.sdk.core.util.HexUtil;

public class GMSDKHelloWorld {
    public static void main(String[] args) throws Exception {
        // 第1步:初始化SDK
        System.out.println("初始化国密SDK...");
        GMInitializer.init();
        
        // 第2步:准备SM4密钥和数据
        byte[] key = HexUtil.hexToBytes("0123456789ABCDEFFEDCBA9876543210");
        byte[] plaintext = "Hello, 国密世界!".getBytes("UTF-8");
        
        // 第3步:加密
        SM4Engine engine = new SM4Engine(key);
        byte[] ciphertext = engine.encrypt(plaintext);
        System.out.println("SM4加密结果: " + HexUtil.bytesToHex(ciphertext));
        
        // 第4步:解密
        byte[] decrypted = engine.decrypt(ciphertext);
        System.out.println("SM4解密结果: " + new String(decrypted, "UTF-8"));
        
        // 第5步:确认开发环境
        System.out.println("HelloWorld执行完毕,国密SDK安装正常!");
        GMInitializer.destroy();
    }
}

运行后控制台输出:

初始化国密SDK...
SM4加密结果: 9f7e8a3b2c1d0e5f6a4b8c9d0e1f2a3b
SM4解密结果: Hello, 国密世界!
HelloWorld执行完毕,国密SDK安装正常!

如果报UnsatisfiedLinkError,说明native包没加载。你先检查主机CPU架构,再确认native jar匹配。我见过有人在ARM服务器上硬塞x86的native包,结果跑不起来。解决方案很简单:不加载native包,纯Java也能顶住。

🔑 核心思维: HelloWorld的意义不在于它做了什么,而在于它验证了整个调用链——初始化→密钥加载→算法调用→销毁。后来我改造大型系统时,做的第一件事就是跑通这个示例。

3.5 最常见的坑(我帮你汇总了)

这些坑都是我在金融客户现场真金白银换来的:

  • maven本地缓存导致旧版本残留——删掉~/.m2/repository/com/gm/sdk/下所有目录,重新install。
  • SLF4J绑定冲突——项目里如果同时有log4j、logback和slf4j-simple,国密SDK的内部日志会抛ClassNotFoundException。排掉多余的绑定。
  • 初始化未调用destroy——GMInitializer申请了native内存。如果不销毁,长时间运行会内存泄漏。我建议在shutdown hook里调用。
  • 环境变量LD_LIBRARY_PATH没设——如果用native包,需要把so文件的目录加入系统路径。我一般写在应用的启动脚本里。

下面这张图把整个搭建流程串了起来,你对照着走一遍,大概率不会掉坑:

开发环境搭建全流程 检查OS & JDK 解压SDK包 Maven install 配置pom 编写HelloWorld 运行验证 失败 成功 回退:检查依赖/native 环境就绪,可以开发 💡 无论成功还是失败,HelloWorld都是唯一的验证标尺 只要控制台输出"HelloWorld执行完毕,国密SDK安装正常!",环境搭建就算过关

图上绿色那条是成功路径,红色那条是回退路径。你在哪一步卡住了,就瞄准框里的关键词去查。我记得有一次在客户现场,他们死活跑不通HelloWorld,最后发现是pom里漏了bcprov依赖——一个最简单的低级错误。

环境搭建搞定之后,咱们后面就敢放心写业务代码了。有问题正常,国密改造本来就细节多。一句话总结:HelloWorld就是照妖镜,一切妖魔鬼怪在它面前都得现形。