Recuperar una clave pública

Puedes recuperar la porción de la clave pública de una versión de clave asimétrica con Google Cloud Platform Console, la herramienta de línea de comandos de gcloud y la API de la versión Beta 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 en la versión de clave. Puedes obtener información sobre los permisos en 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 de 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. La clave pública se muestra y puedes copiarla en tu portapapeles o descargarla. Si no ves la opción Obtener clave pública, verifica si la clave está en una clave asimétrica y si cuentas con el permiso cloudkms.cryptoKeyVersions.viewPublicKey.

    Clave pública

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

Línea de comandos

gcloud alpha 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

func getAsymmetricPublicKey(ctx context.Context, client *cloudkms.Service, keyPath string) (interface{}, error) {
	response, err := client.Projects.Locations.KeyRings.CryptoKeys.CryptoKeyVersions.
		GetPublicKey(keyPath).Context(ctx).Do()
	if err != nil {
		return nil, fmt.Errorf("failed to fetch public key: %+v", err)
	}
	keyBytes := []byte(response.Pem)
	block, _ := pem.Decode(keyBytes)
	publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return nil, fmt.Errorf("failed to parse public key: %+v", err)
	}
	return publicKey, nil
}

Java

/**
 * Retrieves the public key from a saved asymmetric key pair on Cloud KMS
 *
 * Requires:
 *   java.io.StringReader
 *   java.security.KeyFactory
 *   java.security.PublicKey
 *   java.security.Security
 *   java.security.spec.X509EncodedKeySpec
 *   org.bouncycastle.jce.provider.BouncyCastleProvider
 *   org.bouncycastle.util.io.pem.PemReader
 */
public static PublicKey getAsymmetricPublicKey(CloudKMS client, String keyPath)
    throws IOException, NoSuchAlgorithmException, InvalidKeySpecException,
    NoSuchProviderException {
  Security.addProvider(new BouncyCastleProvider());
  com.google.api.services.cloudkms.v1.model.PublicKey response;
  response = client.projects()
                   .locations()
                   .keyRings()
                   .cryptoKeys()
                   .cryptoKeyVersions()
                   .getPublicKey(keyPath)
                   .execute();
  PemReader reader = new PemReader(new StringReader(response.getPem()));
  byte[] pem = reader.readPemObject().getContent();
  X509EncodedKeySpec abstractKey = new X509EncodedKeySpec(pem);
  try {
    return KeyFactory.getInstance("RSA", "BC").generatePublic(abstractKey);
  } catch (InvalidKeySpecException e) {
    return KeyFactory.getInstance("ECDSA", "BC").generatePublic(abstractKey);
  }
}

Python

def getAsymmetricPublicKey(client, key_path):
    """
    Retrieves the public key from a saved asymmetric key pair on Cloud KMS

    Requires:
      cryptography.hazmat.backends.default_backend
      cryptography.hazmat.primitives.serialization
    """
    request = client.projects() \
                    .locations() \
                    .keyRings() \
                    .cryptoKeys() \
                    .cryptoKeyVersions() \
                    .getPublicKey(name=key_path)
    response = request.execute()
    key_txt = response['pem'].encode('ascii')
    key = serialization.load_pem_public_key(key_txt, default_backend())
    return key

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Documentación de Cloud KMS