签名服务器支持多种方式配置私钥和公钥,您可以选择最适合您使用场景的方式。
优点:
缺点:
使用方法:
签名时传入私钥:
curl -X POST http://localhost:8888/api/sign \
-H "Content-Type: application/json" \
-d '{
"data": {
"version": "1.0",
"txnType": "20250",
"reqOrgId": "201811200001003"
},
"priKey": "您的64位十六进制私钥",
"reqOrgNo": "您的机构号"
}'
验签时传入公钥:
curl -X POST http://localhost:8888/api/verify \
-H "Content-Type: application/json" \
-d '{
"data": {
"version": "1.0",
"txnType": "20250"
},
"sign": "签名字符串",
"pubKey": "您的130位十六进制公钥",
"reqOrgNo": "您的机构号"
}'
优点:
缺点:
使用方法:
# 语法:
java -cp "bin:lib/*" demo.com.SignServer [配置文件路径] [机构号] [私钥] [公钥]
# 示例:
java -cp "bin:lib/*" demo.com.SignServer \
"" \
"201811200001003" \
"3164EE0DF2BCA7A12309383E3305DD6563A28DFE53F65BBD60B3A1D7F80AC275" \
"046875695CDF1EF046ABB231FDAFA6DCA2AF1E5719EAC00DE80D65FEF03F8485DC9DCBBC10A9A46D565B4CDCEE3510F276209657CAE5BAC10C9678583A44F7F100"
优点:
缺点:
使用方法:
# 设置环境变量
export SM2_PRIVATE_KEY="您的64位十六进制私钥"
export SLT_PUBLIC_KEY="您的130位十六进制公钥"
export REQ_ORG_NO="您的机构号"
# 启动服务
java -cp "bin:lib/*" demo.com.SignServer
Docker示例:
docker run -d \
-e SM2_PRIVATE_KEY="您的私钥" \
-e SLT_PUBLIC_KEY="您的公钥" \
-e REQ_ORG_NO="您的机构号" \
-p 8888:8888 \
your-sign-server
优点:
缺点:
使用方法:
创建配置文件 config.properties:
# 机构配置
reqOrgNo=201811200001003
# SM2私钥(64位十六进制)
priKey=3164EE0DF2BCA7A12309383E3305DD6563A28DFE53F65BBD60B3A1D7F80AC275
# 平台公钥(130位十六进制)
sltPubKey=046875695CDF1EF046ABB231FDAFA6DCA2AF1E5719EAC00DE80D65FEF03F8485DC9DCBBC10A9A46D565B4CDCEE3510F276209657CAE5BAC10C9678583A44F7F100
设置文件权限(重要!):
chmod 600 config.properties
启动服务:
# 使用默认配置文件(config.properties)
java -cp "bin:lib/*" demo.com.SignServer
# 或指定配置文件路径
java -cp "bin:lib/*" demo.com.SignServer /path/to/your/config.properties
优点:
缺点:
使用方法:
修改 SignServer.java 文件:
// 请求机构号
private static String reqOrgNo = "您的机构号";
// 请求机构的私钥
private static String priKey = "您的SM2私钥";
// 平台给商户的公钥
private static String sltPubKey = "您的SM2公钥";
然后重新编译并启动。
当多种配置方式同时存在时,优先级为:
API接口传入 > 命令行参数 > 环境变量 > 配置文件 > 代码默认值
说明:
建议: 使用 API接口传入 或 配置文件
建议: 使用 配置文件 + 严格的文件权限
chmod 600 保护配置文件建议: 使用 环境变量 或 Secret管理
建议: 使用 API接口传入
永远不要将私钥提交到代码仓库
# 添加到 .gitignore
config.properties
*.key
使用配置文件时,严格限制文件权限
chmod 600 config.properties
chown app_user:app_group config.properties
生产环境建议使用密钥管理服务
启用HTTPS
日志脱敏
3164EE0D...F80AC2753164EE0DF2BCA7A12309383E3305DD6563A28DFE53F65BBD60B3A1D7F80AC275046875695CDF1EF046ABB231FDAFA6DCA2AF1E5719EAC00DE80D65FEF03F8485DC9DCBBC10A9A46D565B4CDCEE3510F276209657CAE5BAC10C9678583A44F7F100A: 确保私钥是64位的十六进制字符串,不包含空格、换行等其他字符。
A: 可以,如果不传机构号,会使用服务器配置的默认机构号。
A: 不会,私钥仅在当次请求中使用,请求结束后立即释放,不会持久化存储。
A: 可以,通过API接口传入私钥的方式,每个客户端都可以使用自己的私钥。
启动服务器后,测试不同配置方式:
# 测试1:使用服务器默认配置
curl -X POST http://localhost:8888/api/sign \
-H "Content-Type: application/json" \
-d '{"data": {"version": "1.0"}}'
# 测试2:传入自定义私钥
curl -X POST http://localhost:8888/api/sign \
-H "Content-Type: application/json" \
-d '{
"data": {"version": "1.0"},
"priKey": "3164EE0DF2BCA7A12309383E3305DD6563A28DFE53F65BBD60B3A1D7F80AC275",
"reqOrgNo": "TEST123"
}'
选择合适的配置方式取决于您的具体需求:
| 配置方式 | 灵活性 | 安全性 | 适用场景 |
|---|---|---|---|
| API传入 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 多租户、SaaS |
| 命令行参数 | ⭐⭐⭐⭐ | ⭐⭐ | 脚本部署 |
| 环境变量 | ⭐⭐⭐ | ⭐⭐⭐⭐ | 容器化部署 |
| 配置文件 | ⭐⭐ | ⭐⭐⭐ | 单机部署 |
| 代码默认值 | ⭐ | ⭐ | 仅供测试 |
生产环境推荐: API传入(多租户)或 环境变量(单租户)