本主题介绍了如何基于非对称密钥创建和验证数字签名。
数字签名使用非对称密钥的私钥部分进行创建,并使用同一非对称密钥的公钥部分进行验证。
准备工作
创建数字签名时,您必须使用具有密钥用途为
ASYMMETRIC_SIGN
的密钥。在创建密钥时,请使用ASYMMETRIC_SIGN
。要验证签名,您需要知道创建密钥时使用的完整算法。对于使用
openssl
命令的以下命令行说明,您需要将此信息传递给这些命令。将非对称密钥的
cloudkms.cryptoKeyVersions.useToSign
权限授予将执行签名的用户或服务。您可以参阅权限和角色,了解 Cloud Key Management Service 中的权限。如果您要验证签名,请将非对称密钥的
cloudkms.cryptoKeyVersions.viewPublicKey
权限授予将下载公钥的使用者或服务以用于验证。如果您要使用命令行,请安装 OpenSSL(如果尚未安装)。如果您使用 Cloud Shell,则 OpenSSL 已安装。
数据与摘要
为 AsymmetricSign 请求提供的输入可以通过 data
字段或 digest
字段传递。不能同时指定这些字段。一些算法需要数据字段,例如原始算法和使用 Cloud External Key Manager 密钥进行签名。
原始算法
“原始”算法(由 RSA_SIGN_RAW_
前缀标识)是 PKCS #1 签名的一种变体,省略了对 DigestInfo 的编码。在此变体中:
- 系统会针对将签名的消息计算摘要。
- PKCS #1 填充会直接应用于摘要。
- 系统会使用 RSA 私钥计算已填充的摘要的签名。
如需使用这些算法,请满足以下要求:
- 原始数据需要作为
data
字段的一部分提供(而不是摘要)。 - 数据的长度上限为 11 个字节(小于 RSA 密钥大小)。例如,具有 2048 位 RSA 密钥的 PKCS #1 最多可以为 245 个字节签名。
- 将
cloudkms.expertRawPKCS1
角色授予相应的用户或服务。您可以参阅权限和角色,了解 Cloud Key Management Service 中的权限。
对其他哈希算法的 ECDSA 支持
我们的 ECDSA 签名算法采用以下一般格式:
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
DIGEST_ALGORITHM 的值为 SHA256
、SHA384
或 SHA512
。由于哈希是在创建签名之前执行的,因此这些签名算法还可与 SHA 以外的摘要(例如 Keccak)搭配使用。如需使用 Keccak 摘要,请提供 Keccak 哈希值,并使用长度相同的 SHA 摘要算法。例如,您可以在使用 EC_SIGN_P256_SHA256
算法的请求中使用 KECCAK256
摘要。
创建签名
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
gcloud kms asymmetric-sign \ --version key-version \ --key key \ --keyring key-ring \ --location location \ --digest-algorithm digest-algorithm \ --input-file input-file \ --signature-file signature-file
将 key-version 替换为用于签名的密钥的版本。将 key 替换为密钥名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。将 digest-algorithm 替换为要使用的算法。省略 digest-algorithm 以将 input-file 发送到 Cloud KMS 进行签名。将 input-file 和 signature-file 分别替换为要签名的文件和签名文件的本地路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 CryptoKeyVersions.asymmetricSign
方法执行签名。此方法返回的响应包含 base64 编码的签名。
验证椭圆曲线签名
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
获取公钥
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
将 key-version 替换为密钥版本。将 key 替换为密钥的名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。将 output-file 替换为要在本地系统上保存公钥的文件路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
验证签名
用于验证签名的 OpenSSL 命令取决于已创建的签名类型。例如,要使用 OpenSSL 验证 SHA-256 椭圆曲线签名,必须指定 -sha256
。要验证 SHA-384 椭圆曲线签名,必须指定 -sha384
。
openssl dgst \ -sha256 \ -verify public-key-file \ -signature signature-file \ message-file
将变量替换为您自己的值:
public-key-file。包含公钥的文件的路径(例如
"./my-key.pub"
)。signature-file。包含要验证的签名的文件的路径(例如
"./my-data.sig"
)。message-file。包含消息的文件的路径(例如
"./my-data.txt"
)。
如果签名有效,该命令将输出字符串 Verified OK
。
如需了解所有标志和可能值,请使用 help
子命令运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 CryptoKeyVersions.getPublicKey 方法检索公钥,然后使用命令行示例中显示的命令验证签名。
验证 RSA 签名
gcloud
如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI。
获取公钥
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
将 key-version 替换为密钥版本。将 key 替换为密钥的名称。将 key-ring 替换为密钥所在的密钥环的名称。将 location 替换为密钥环的 Cloud KMS 位置。将 output-file 替换为在本地系统上保存公钥的路径。
如需了解所有标志和可能值,请使用 --help
标志运行命令。
验证签名
用于验证签名的 OpenSSL 命令取决于已创建的签名类型。例如,要验证带 PSS 填充的 SHA-256 RSA 签名,您必须指定 -sha256
和 -sigopt rsa_padding_mode:pss
。要验证带 PSS 填充的 SHA-512 RSA 签名,您必须指定 -sha512
和 -sigopt
rsa_padding_mode:pss
。
openssl dgst \ -sha256 \ -sigopt rsa_padding_mode:pss \ -sigopt rsa_pss_saltlen:-1 \ -verify public-key-file \ -signature signature-file \ message-file
将变量替换为您自己的值:
public-key-file。包含公钥的文件的路径(例如
"./my-key.pub"
)。signature-file。包含要验证的签名的文件的路径(例如
"./my-data.sig"
)。message-file。包含消息的文件的路径(例如
"./my-data.txt"
)。
如果签名有效,该命令将输出字符串 Verified OK
。
如需了解所有标志和可能值,请使用 help
子命令运行命令。
C#
要运行此代码,请先设置 C# 开发环境并安装 Cloud KMS C# SDK。
Go
要运行此代码,请先设置 Go 开发环境并安装 Cloud KMS Go SDK。
Java
要运行此代码,请先设置 Java 开发环境并安装 Cloud KMS Java SDK。
Node.js
要运行此代码,请先设置 Node.js 开发环境并安装 Cloud KMS Node.js SDK。
PHP
要运行此代码,请先了解如何在 Google Cloud 上使用 PHP 并安装 Cloud KMS PHP SDK。
Python
要运行此代码,请先设置 Python 开发环境并安装 Cloud KMS Python SDK。
Ruby
要运行此代码,请先设置 Ruby 开发环境并安装 Cloud KMS Ruby SDK。
API
这些示例使用 curl 作为 HTTP 客户端来演示如何使用 API。如需详细了解访问权限控制,请参阅访问 Cloud KMS API。
使用 CryptoKeyVersions.getPublicKey
方法检索公钥,然后使用命令行示例中显示的命令验证签名。