Recupera una clave pública

Puedes recuperar la porción de clave pública de una versión de clave asimétrica si usas 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 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 (Get public key), 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 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


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

	// Build the request.
	req := &kmspb.GetPublicKeyRequest{
		Name: keyName,
	}
	// Call the API.
	response, err := client.GetPublicKey(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("failed to fetch public key: %+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("failed to parse public key: %+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

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

Enviar comentarios sobre...