# SM2签名服务 - HTTP API 基于国密SM2算法的签名和验签HTTP服务,使用纯Java实现(BouncyCastle),支持Docker部署。 ## 🚀 快速开始 ### 本地运行(需要Java) ```bash # 编译 javac -encoding UTF-8 -d bin -cp "lib/*" $(find src -name "*.java") # 运行 java -cp "bin:lib/*" demo.com.SignServer ``` 访问: http://localhost:8888 ### Docker部署(无需Java)⭐ ```bash # 一键部署 ./deploy.sh # 或使用docker-compose docker-compose up -d ``` **服务器只需要Docker,不需要Java环境!** ## 📡 API接口 ### 1. 签名接口 ```bash POST http://localhost:8888/api/sign # 请求体 { "data": { "version": "1.0", "txnType": "20250" }, "priKey": "私钥(可选)", "reqOrgNo": "机构号(可选)" } # 响应 { "success": true, "signData": "TXNTYPE=20250|VERSION=1.0", "sign": "304402206FC7...", "timestamp": 1761288550594 } ``` ### 2. 验签接口 ```bash POST http://localhost:8888/api/verify # 请求体 { "data": { "version": "1.0" }, "sign": "304402206FC7...", "pubKey": "公钥(可选)", "reqOrgNo": "机构号(可选)" } # 响应 { "success": true, "valid": true, "signData": "VERSION=1.0", "timestamp": 1761288550803 } ``` ### 3. 健康检查 ```bash GET http://localhost:8888/api/health # 响应 { "status": "ok", "timestamp": 1761288550040 } ``` ## 🔑 私钥配置方式 支持5种配置方式(按优先级从高到低): 1. **API接口传入**(最灵活)⭐ - 在请求中传入 `priKey` 和 `reqOrgNo` - 适合多租户场景 2. **命令行参数** ```bash java -cp "bin:lib/*" demo.com.SignServer "" "机构号" "私钥" "公钥" ``` 3. **环境变量**(推荐生产环境)⭐ ```bash export SM2_PRIVATE_KEY="私钥" export REQ_ORG_NO="机构号" java -cp "bin:lib/*" demo.com.SignServer ``` 4. **配置文件** ```properties # config.properties reqOrgNo=201811200001003 priKey=您的私钥 sltPubKey=您的公钥 ``` 5. **代码默认值**(仅供测试) 详细说明请查看: [私钥配置说明.md](私钥配置说明.md) ## 📦 技术栈 - **语言**: Java 8+ - **加密库**: BouncyCastle 1.46 (纯Java实现) - **算法**: 国密SM2/SM3 - **HTTP服务器**: JDK内置HttpServer - **容器**: Docker **不依赖OpenSSL,不需要安装系统扩展!** ## 📚 文档 - [API使用说明.md](API使用说明.md) - 详细的API文档 - [部署说明.md](部署说明.md) - Docker部署完整指南 - [私钥配置说明.md](私钥配置说明.md) - 各种私钥配置方式 - [快速部署.txt](快速部署.txt) - 快速参考卡片 ## 🐳 Docker部署 ### 使用docker-compose(推荐) ```bash # 启动 docker-compose up -d # 查看日志 docker-compose logs -f # 停止 docker-compose down ``` ### 使用Dockerfile ```bash # 构建镜像 docker build -t sign-server:latest . # 运行容器 docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ --restart unless-stopped \ sign-server:latest ``` ### 传入自定义密钥 ```bash docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ -e SM2_PRIVATE_KEY="您的私钥" \ -e SLT_PUBLIC_KEY="您的公钥" \ -e REQ_ORG_NO="您的机构号" \ sign-server:latest ``` ## 🔒 安全建议 1. ✅ 生产环境使用HTTPS 2. ✅ 不要将私钥提交到代码仓库 3. ✅ 使用环境变量或配置文件管理密钥 4. ✅ 配置文件设置严格权限 `chmod 600` 5. ✅ API传入密钥时必须使用HTTPS ## 📊 性能 - 镜像大小: ~85MB (Alpine Linux) - 启动时间: ~3秒 - 内存占用: ~100-200MB - 签名速度: ~100-500 TPS (取决于硬件) ## 🛠️ 开发 ### 项目结构 ``` xingfutong-java/ ├── src/demo/com/ │ ├── SignServer.java # HTTP签名服务器 │ ├── Test.java # 测试类 │ ├── entity/ # 实体类 │ ├── service/ # 服务接口 │ └── util/ │ ├── ByteArrayUtil.java # 字节工具 │ ├── cxf/ # CXF工具 │ └── sm/ # SM2/SM3实现 │ ├── SM2.java # SM2核心算法 │ ├── SM2Utils.java # SM2工具类 │ ├── SM3.java # SM3算法 │ ├── Cipher.java # 加密器 │ └── Utils.java # 工具类 ├── lib/ # 依赖库 │ ├── bcprov-jdk16-1.46.jar # BouncyCastle │ ├── fastjson-1.2.40.jar # JSON解析 │ └── ... ├── bin/ # 编译输出 ├── Dockerfile # Docker镜像定义 ├── docker-compose.yml # Docker编排 ├── deploy.sh # 一键部署脚本 └── *.md # 文档 ``` ### 编译 ```bash javac -encoding UTF-8 -d bin -cp "lib/*" $(find src -name "*.java") ``` ### 运行 ```bash java -cp "bin:lib/*" demo.com.SignServer ``` ## ❓ 常见问题 ### Q: 服务器没有Java怎么办? **A**: 使用Docker部署,只需要安装Docker即可。 ### Q: 私钥存在哪里最安全? **A**: 多租户场景通过API传入;单租户使用环境变量或Secret管理工具。 ### Q: 支持什么版本的Java? **A**: Java 8及以上版本。Docker镜像使用OpenJDK 8。 ### Q: SM2是什么? **A**: 国密SM2是中国自主研发的椭圆曲线公钥密码算法,相当于国际上的ECDSA。 ### Q: 为什么不用OpenSSL? **A**: 使用纯Java的BouncyCastle实现,跨平台、易部署、无需安装系统扩展。 ## 📝 更新日志 ### v1.0.0 - ✅ SM2签名和验签功能 - ✅ HTTP API服务 - ✅ 支持API传入私钥 - ✅ 支持多种配置方式 - ✅ Docker容器化部署 - ✅ 完整文档 ## 📄 许可证 本项目仅供学习和测试使用。 ## 🤝 贡献 欢迎提交Issue和Pull Request。 --- **快速上手**: 查看 [快速部署.txt](快速部署.txt) **详细文档**: 查看 [部署说明.md](部署说明.md)