检索公钥

本页介绍如何检索已启用的非对称密钥版本的公钥部分。

公钥的格式取决于它是后量子计算 (PQC) 算法还是传统算法:

  • 对于非 PQC 算法,公钥的默认格式是隐私权保密增强电子邮件 (PEM) 格式。您还可以检索唯一编码规则 (DER) 格式的非 PQC 公钥。如需了解详情,请参阅 RFC 7468,尤其是“一般注意事项”和“正文公钥信息的文本编码”部分。

  • 对于 NIST 标准化的 PQC 算法,您可以检索 NIST PCQ 标准中针对该算法确定的格式的公钥。如需了解详情,请参阅 FIPS-203FIPS-204FIPS-205。 PEM 和 DER 格式仅支持 ML-DSA 密钥。

  • 对于 X-Wing,您可以检索以 X-Wing 标准指定的原始字节格式的公钥。这些密钥不支持 PEM 和 DER 格式。

所需的角色

如需获得检索公钥所需的权限,请让您的管理员为您授予密钥或父级资源的 Cloud KMS CryptoKey Public Key Viewer (roles/cloudkms.publicKeyViewer) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色包含检索公钥所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需检索公钥,您需要具备以下权限:

  • cloudkms.cryptoKeyVersions.viewPublicKey
  • cloudkms.locations.get
  • cloudkms.locations.list
  • resourcemanager.projects.get

您也可以使用自定义角色或其他预定义角色来获取这些权限。

检索公钥

您可以指定要检索的公钥的格式。 如果指定了格式,则密钥将以指定格式返回,并显示在响应的 public_key 字段中。否则,它会在响应的 pem 字段中返回。

如需下载已启用的非对称密钥版本的公钥,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往密钥管理页面。

    前往“密钥管理”

  2. 点击包含您要检索公钥的非对称密钥的密钥环的名称。

  3. 点击要检索公钥的密钥的名称。

  4. 在与要检索公钥的密钥版本对应的行中,点击查看更多

  5. 点击获取公钥

  6. 公钥显示在提示中。您可以将公钥复制到剪贴板。要下载公钥,请点击下载

如果您没有看到获取公钥选项,请验证以下各项:

  • 密钥是非对称密钥。
  • 密钥版本已启用。
  • 您拥有 cloudkms.cryptoKeyVersions.viewPublicKey 权限。

从 Google Cloud 控制台下载的公钥的文件名格式为:

KEY_RING-KEY_NAME-KEY_VERSION.pub

文件名的每个部分由连字符分隔,例如 ringname-keyname-version.pub

gcloud

如需在命令行上使用 Cloud KMS,请先安装或升级到最新版本的 Google Cloud CLI

gcloud kms keys versions get-public-key KEY_VERSION \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location LOCATION \
    --public-key-format PUBLIC_KEY_FORMAT \
    --output-file OUTPUT_FILE_PATH

替换以下内容:

  • KEY_VERSION:密钥版本号。
  • KEY_NAME:密钥的名称。
  • KEY_RING:包含密钥的密钥环的名称。
  • LOCATION:密钥环的 Cloud KMS 位置。
  • PUBLIC_KEY_FORMAT:您要导出公钥的格式。对于 NIST PQC 算法,请使用 nist-pqc;对于 X-Wing,请使用 xwing-raw-bytes。对于所有其他键,您可以使用 pemder 或省略此参数。
  • OUTPUT_FILE_PATH:您要保存公钥文件的路径,例如 public-key.pub

如需了解所有标志和可能值,请使用 --help 标志运行命令。

C#

要运行此代码,请先设置 C# 开发环境安装 Cloud KMS C# SDK


using Google.Cloud.Kms.V1;

public class GetPublicKeySample
{
    public PublicKey GetPublicKey(string projectId = "my-project", string locationId = "us-east1", string keyRingId = "my-key-ring", string keyId = "my-key", string keyVersionId = "123")
    {
        // Create the client.
        KeyManagementServiceClient client = KeyManagementServiceClient.Create();

        // Build the key version name.
        CryptoKeyVersionName keyVersionName = new CryptoKeyVersionName(projectId, locationId, keyRingId, keyId, keyVersionId);

        // Call the API.
        PublicKey result = client.GetPublicKey(keyVersionName);

        // Return the ciphertext.
        return result;
    }
}

Go

要运行此代码,请先设置 Go 开发环境安装 Cloud KMS Go SDK

import (
	"context"
	"crypto/x509"
	"encoding/pem"
	"fmt"
	"hash/crc32"
	"io"

	kms "cloud.google.com/go/kms/apiv1"
	"cloud.google.com/go/kms/apiv1/kmspb"
)

// getPublicKey retrieves the public key from an asymmetric key pair on
// Cloud KMS.
func getPublicKey(w io.Writer, name string) error {
	// name := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key/cryptoKeyVersions/123"

	// Create the client.
	ctx := context.Background()
	client, err := kms.NewKeyManagementClient(ctx)
	if err != nil {
		return fmt.Errorf("failed to create kms client: %w", err)
	}
	defer client.Close()

	// Build the request.
	req := &kmspb.GetPublicKeyRequest{
		Name: name,
	}

	// Call the API.
	result, err := client.GetPublicKey(ctx, req)
	if err != nil {
		return fmt.Errorf("failed to get public key: %w", err)
	}

	// The 'Pem' field is the raw string representation of the public key.
	// Convert 'Pem' into bytes for further processing.
	key := []byte(result.Pem)