Obtenha uma chave pública

Esta página mostra como obter a parte da chave pública de uma versão de chave assimétrica ativada.

O formato da chave pública depende de se tratar de um algoritmo de computação pós-quântica (PQC) ou convencional:

  • Para algoritmos não PQC, o formato predefinido da chave pública é o formato de correio eletrónico otimizado para privacidade (PEM). Também pode obter chaves públicas não PQC no formato Distinguished Encoding Rules (DER). Para mais informações, consulte a RFC 7468, em particular as secções "Considerações gerais" e "Codificação textual de informações de chave pública de assunto".

  • Para algoritmos PQC padronizados pela NIST (Pré-visualização), pode obter a chave pública no formato identificado nas normas PCQ da NIST para esse algoritmo. Para mais informações, consulte as normas FIPS-203, FIPS-204 e FIPS-205. Os formatos PEM e DER não são suportados para estas chaves.

  • Para o X-Wing (pré-visualização), pode obter a chave pública no formato de bytes brutos especificado pela norma X-Wing. Os formatos PEM e DER não são suportados para estas chaves.

Funções necessárias

Para obter as autorizações de que precisa para obter uma chave pública, peça ao seu administrador para lhe conceder a função da IAM Visualizador de chaves públicas de CryptoKey do Cloud KMS (roles/cloudkms.publicKeyViewer) na sua chave ou num recurso principal. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Esta função predefinida contém as autorizações necessárias para obter uma chave pública. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para obter uma chave pública:

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

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Obtenha uma chave pública

Pode especificar o formato no qual quer obter a chave pública. Se o formato for especificado, a chave é devolvida no formato especificado no campo public_key da resposta. Caso contrário, é devolvido no campo pem da resposta.

Para transferir a chave pública de uma versão de chave assimétrica ativada:

Consola

  1. Na Google Cloud consola, aceda à página Gestão de chaves.

    Aceda à gestão de chaves

  2. Clique no nome do conjunto de chaves que contém a chave assimétrica para a qual quer obter a chave pública.

  3. Clique no nome da chave para a qual quer obter a chave pública.

  4. Na linha correspondente à versão da chave para a qual quer obter a chave pública, clique em Ver mais .

  5. Clique em Obter chave pública.

  6. A chave pública é apresentada no comando. Pode copiar a chave pública para a área de transferência. Para transferir a chave pública, clique em Transferir.

Se não vir a opção Obter chave pública, verifique o seguinte:

  • A chave é uma chave assimétrica.
  • A versão da chave está ativada.
  • Tem a autorização cloudkms.cryptoKeyVersions.viewPublicKey.

O nome do ficheiro de uma chave pública transferida a partir da consola tem o seguinte formato: Google Cloud

KEY_RING-KEY_NAME-KEY_VERSION.pub

Cada parte do nome do ficheiro é separada por um hífen, por exemplo ringname-keyname-version.pub.

gcloud

Para usar o Cloud KMS na linha de comandos, primeiro instale ou atualize para a versão mais recente da CLI do Google Cloud.

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

Substitua o seguinte:

  • KEY_VERSION: o número da versão da chave.
  • KEY_NAME: o nome da chave.
  • KEY_RING: o nome do conjunto de chaves que contém a chave.
  • LOCATION: a localização do Cloud KMS do conjunto de chaves.
  • PUBLIC_KEY_FORMAT: o formato no qual quer exportar a chave pública. Para algoritmos PQC da NIST (pré-visualização), use nist-pqc e, para o X-Wing (pré-visualização), use xwing-raw-bytes. Para todas as outras chaves, pode usar pem, der ou omitir este parâmetro.
  • OUTPUT_FILE_PATH: o caminho onde quer guardar o ficheiro de chave pública, por exemplo, public-key.pub.

Para ver informações sobre todas as flags e valores possíveis, execute o comando com a flag --help.

C#

Para executar este código, primeiro configure um ambiente de desenvolvimento C# e instale o SDK C# do Cloud KMS.


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

Para executar este código, primeiro configure um ambiente de desenvolvimento Go e instale o SDK Go do Cloud KMS.

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)

	// Optional, but recommended: perform integrity verification on result.
	// For more details on ensuring E2E in-transit integrity to and from Cloud KMS visit:
	// https://cloud.google.com/kms/docs/data-integrity-guidelines
	crc32c := func(data []byte) uint32 {
		t := crc32.MakeTable(crc32.Castagnoli)
		return crc32.Checksum(data, t)
	}
	if int64(crc32c(key)) != result.PemCrc32C.Value {
		return fmt.Errorf("getPublicKey: response corrupted in-transit")
	}

	// Optional - parse the public key. This transforms the string key into a Go
	// PublicKey.
	block, _ := pem.Decode(key)
	publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return fmt.Errorf("failed to parse public key: %w", err)
	}
	fmt.Fprintf(w, "Retrieved public key: %v\n", publicKey)
	return nil
}

Java

Para executar este código, primeiro configure um ambiente de desenvolvimento Java e instale o SDK Java do Cloud KMS.

import com.google.cloud.kms.v1.CryptoKeyVersionName;
import com.google.cloud.kms.v1.KeyManagementServiceClient;
import com.google.cloud.kms.v1.PublicKey;
import java.io.IOException;
import java.security.GeneralSecurityException;

public class GetPublicKey {

  public void getPublicKey() throws IOException, GeneralSecurityException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String locationId = "us-east1";
    String keyRingId = "my-key-ring";