Recupera una clave pública

Puedes recuperar la parte pública de una versión de clave asimétrica mediante Google Cloud Platform Console, la herramienta de línea de comandos de gcloud y la API de Cloud KMS.

La clave pública se encuentra en el formato de correo electrónico con privacidad mejorada (PEM). Para obtener más información, consulta las secciones sobre consideraciones generales y codificación textual de la información sobre la clave pública del sujeto de RFC 7468.

El usuario o servicio que recuperará la clave pública necesita el permiso cloudkms.cryptoKeyVersions.viewPublicKey sobre la versión de clave. Puedes obtener información sobre los permisos de la versión Beta de Cloud KMS en Permisos y funciones.

Console

Sigue estos pasos para descargar la clave pública de una versión de clave asimétrica existente:

  1. Abre la página Claves criptográficas en GCP Console.
  2. Haz clic en el nombre del llavero de claves que contiene la clave asimétrica.
  3. Haz clic en el nombre de la clave que contiene la versión de clave.
  4. Para la versión de clave cuya clave pública deseas recuperar, haz clic en el ícono Más (3 puntos verticales).
  5. Haz clic en Obtener clave pública. Se mostrará la clave pública para que puedes copiarla en tu portapapeles o descargarla. Si no ves la opción Obtener clave pública, verifica si se trata de una clave asimétrica y si cuentas con el permiso cloudkms.cryptoKeyVersions.viewPublicKey.

    Clave pública

El nombre de archivo de una clave pública descargada de GCP Console tiene el formato [KEY_RING]-[KEY]-[CRYPTO_KEY_VERSION].pub.

Línea de comandos

gcloud kms keys versions \
  get-public-key CRYPTO_KEY_VERSION \
  --location LOCATION \
  --keyring KEY_RING \
  --key KEY \
  --output-file ~/mykey.pub

API

Recupera la clave pública mediante una llamada al método CryptoKeyVersions.getPublicKey.

Especifica el ID del recurso de la versión de clave de la clave pública que quieres recuperar.

Go

import (
	"context"
	"crypto/x509"
	"encoding/pem"
	"fmt"

	cloudkms "cloud.google.com/go/kms/apiv1"
	kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1"
)

// getAsymmetricPublicKey retrieves the public key from a saved asymmetric key pair on KMS.
func getAsymmetricPublicKey(name string) (interface{}, error) {
	// name: "projects/PROJECT_ID/locations/global/keyRings/RING_ID/cryptoKeys/KEY_ID/cryptoKeyVersions/1"
	ctx := context.Background()
	client, err := cloudkms.NewKeyManagementClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("cloudkms.NewKeyManagementClient: %v", err)
	}

	// Build the request.
	req := &kmspb.GetPublicKeyRequest{
		Name: name,
	}
	// Call the API.
	response, err := client.GetPublicKey(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("GetPublicKey: %v", err)
	}
	// Parse the key.
	keyBytes := []byte(response.Pem)
	block, _ := pem.Decode(keyBytes)
	publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return nil, fmt.Errorf("x509.ParsePKIXPublicKey: %v", err)
	}
	return publicKey, nil
}

Java

/**
 * Retrieves the public key from a saved asymmetric key pair on Cloud KMS
 *
 * Example keyName:
 *   "projects/PROJECT_ID/locations/global/keyRings/RING_ID/cryptoKeys/KEY_ID/cryptoKeyVersions/1"
 */
public static PublicKey getAsymmetricPublicKey(String keyName)
    throws IOException, GeneralSecurityException {

  // Create the Cloud KMS client.
  try (KeyManagementServiceClient client = KeyManagementServiceClient.create()) {
    com.google.cloud.kms.v1.PublicKey pub = client.getPublicKey(keyName);

    // Convert a PEM key to DER without taking a dependency on a third party library
    String pemKey = pub.getPem();
    pemKey = pemKey.replaceFirst("-----BEGIN PUBLIC KEY-----", "");
    pemKey = pemKey.replaceFirst("-----END PUBLIC KEY-----", "");
    pemKey = pemKey.replaceAll("\\s", "");
    byte[] derKey = BaseEncoding.base64().decode(pemKey);

    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(derKey);

    if (pub.getAlgorithm().name().contains("RSA")) {
      return KeyFactory.getInstance("RSA").generatePublic(keySpec);
    } else if (pub.getAlgorithm().name().contains("EC")) {
      return KeyFactory.getInstance("EC").generatePublic(keySpec);
    } else {
      throw new UnsupportedOperationException(String.format(
          "key at path '%s' is of unsupported type '%s'.", keyName, pub.getAlgorithm()));
    }
  }
}

Python

def get_asymmetric_public_key(key_name):
    """
    Retrieves the public key from a saved asymmetric key pair on Cloud KMS

    Example key_name:
      "projects/PROJECT_ID/locations/global/keyRings/RING_ID/cryptoKeys\
              /KEY_ID/cryptoKeyVersions/1"

    Requires:
      cryptography.hazmat.backends.default_backend
      cryptography.hazmat.primitives.serialization
    """

    client = kms_v1.KeyManagementServiceClient()
    response = client.get_public_key(key_name)

    key_txt = response.pem.encode('ascii')
    key = serialization.load_pem_public_key(key_txt, default_backend())
    return key