tencent cloud

密钥管理系统

产品简介
产品概述
产品优势
应用场景
基本概念
购买指南
计费概述
购买方式
续费说明
欠费说明
控制台指南
入门概述
密钥管理
访问控制
审计
TCCLI 管理指南
操作总览
创建密钥
查看密钥
编辑密钥
启用禁用密钥
密钥轮换
对称密钥加解密
非对称密钥解密
删除密钥
实践教程
对称加解密
非对称加解密
KMS 后量子密码实践
外部密钥导入
指数回退策略应对服务限频
云产品集成 KMS 实现透明加密
API 文档
History
Introduction
API Category
Key APIs
Making API Requests
Asymmetric Key APIs
Data Types
Error Codes
服务等级协议
常见问题
一般性问题
开发接入相关问题
KMS 政策
隐私政策
数据处理和安全协议
联系我们
词汇表

SM2 签名验签

PDF
聚焦模式
字号
最后更新时间: 2025-08-19 11:57:44
本文将为您介绍如何使用 SM2 签名验签算法。

操作步骤

步骤1:创建非对称签名密钥

注意:
在密钥管理系统(KMS)中调用 创建主密钥 接口创建用户主密钥时,在 KMS 中创建密钥的时候,必须传入正确的密钥用途 KeyUsage= ASYMMETRIC_SIGN_VERIFY_SM2,才可以使用签名的功能。
请求:
tccli kms CreateKey --Alias test --KeyUsage ASYMMETRIC_SIGN_VERIFY_SM2
返回结果:
{
"Response": {
"KeyId": "22d79428-61d9-11ea-a3c8-525400******",
"Alias": "test",
"CreateTime": 1583739580,
"Description": "",
"KeyState": "Enabled",
"KeyUsage": "ASYMMETRIC_SIGN_VERIFY_SM2",
"TagCode": 0,
"TagMsg": "",
"RequestId": "0e3c62db-a408-406a-af27-dd5ced******"
}
}

步骤2:下载公钥

请求:
tccli kms GetPublicKey --KeyId 22d79428-61d9-11ea-a3c8-525400******
返回结果:
{
"Response": {
"RequestId": "408fa858-cd6d-4011-b8a0-653805******",
"KeyId": "22d79428-61d9-11ea-a3c8-525400******",
"PublicKey": "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFLlge0vtct949CwtadHODzisgXJahujq+PvM***************bBs/f3axWbvgvHx8Jmqw==",
"PublicKeyPem": "-----BEGIN PUBLIC KEY-----\\nMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFLlge0vtct949CwtadHODzisgXJa\\nhujq+PvM***************bBs/f3axWbvgvHx8Jmqw==\\n-----END PUBLIC KEY-----\\n"
}
}
将公钥 PublicKeyPem 转成 pem 格式,并存入 public_key.pem 文件:
echo "-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFLlge0vtct949CwtadHODzisgXJa
hujq+PvM***************bBs/f3axWbvgvHx8Jmqw==
-----END PUBLIC KEY-----" > public_key.pem
说明:
另外,您可以登录 KMS 控制台 ,单击用户密钥 > 密钥ID/密钥名称进入密钥信息页面,直接下载非对称密钥公钥。

步骤3:创建信息的明文文件

创建测试明文文件:
echo "test" > test_verify.txt
注意:
当生成的文件内容中,存在不可见的字符情况下(如换行符等),需对文件进行truncate操作(truncate -s -1 test_verify.txt),从而保证签名准确。

步骤4:步骤计算消息摘要

如果待签名的消息的长度不超过4096字节,可以跳过本步骤,直接进入 步骤 5
如果待签名的消息的长度超过4096字节,则需先在用户端本地计算消息摘要。 使用 gmssl 对 test_verity.txt 文件内容进行摘要计算:
gmssl sm2utl -dgst -in ./test_verify.txt -pubin -inkey ./public_key.pem -id 1234567812345678 > digest.bin

步骤5:通过 KMS 签名接口生成签名

调用 KMS 的 签名 API 接口计算信息的签名。
1. 消息原文或消息摘要进行计算签名之前,需先进行 base64 编码。
//消息摘要进行base64编码
gmssl enc -e -base64 -A -in digest.bin -out encoded.base64
//消息原文进行base64编码
gmssl enc -e -base64 -A -in test_verify.txt -out encoded.base64
2. 进行签名的计算。 请求:
// 将上述 encoded.base64 的文件内容作为 SignByAsymmetricKey 的 Message 参数,以消息摘要的形式进行签名
tccli kms SignByAsymmetricKey --KeyId 22d79428-61d9-11ea-a3c8-525400****** --Algorithm SM2DSA --Message "qJQj83hSyOuU7Tn0SRReGCk4yuuVWaeZ44BP******==" --MessageType DIGEST

// 以消息原文的形式进行签名(原文要进行Base64编码)
tccli kms SignByAsymmetricKey --KeyId 22d79428-61d9-11ea-a3c8-525400****** --Algorithm SM2DSA --Message "dG***Ao=" --MessageType RAW
返回结果:
{
"Response": {
"Signature": "U7Tn0SRReGCk4yuuVWaeZ4******",
"RequestId": "408fa858-cd6d-4011-b8a0-653805******"
}
}
将签名内容 Signature 存入 signContent.sign 文件:
echo "U7Tn0SRReGCk4yuuVWaeZ4******" | base64 -d > signContent.bin

步骤6:验证签名

通过 KMS 验证签名接口校验( 推荐使用该方法进行验签 ) 请求:
// 对消息原文进行验证(原文要进行Base64编码)
tccli kms VerifyByAsymmetricKey --KeyId 22d79428-61d9-11ea-a3c8-525400****** --SignatureValue "U7Tn0SRReGCk4yuuVWaeZ4******" --Message "dG***Ao=" --Algorithm SM2DSA --MessageType RAW
// 对消息摘要进行验证(将步骤4 encoded.base64 文件内容作为 VerifyByAsymmetricKey 的 Message 参数,以消息摘要的形式进行验签)
tccli kms VerifyByAsymmetricKey --KeyId 22d79428-61d9-11ea-a3c8-525400****** --SignatureValue "U7Tn0SRReGCk4yuuVWaeZ4******" --Message "QUuAcNFr1Jl5+3GDbCxU7te7Uekq+oTxZ**********=" --Algorithm SM2DSA --MessageType DIGEST
说明:
签名接口和验签接口中使用的参数 Message 和 MessageType 的取值要保持一致。
返回结果:
{
"Response": {
"SignatureValid": true,
"RequestId": "6758cbf5-5e21-4c37-a2cf-8d47f5******"
}
}
通过 KMS 公钥和签名内容在本地进行验证 请求:
gmssl sm2utl -verify -in ./test_verify.txt -sigfile ./signContent.bin -pubin -inkey ./public_key.pem -id 1234567812345678
返回结果:
Signature Verification Successful


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈