公開鍵の取得

非対称鍵バージョンの公開鍵部分は、Google Cloud Platform Console、gcloud コマンドライン ツール、Cloud KMS API を使用して取得できます。

公開鍵はプライバシー強化メール(PEM)形式です。詳しくは一般的な考慮事項RFC 7468 のセクションと主体者公開鍵情報のテキスト エンコーディングをご覧ください。

公開鍵を取得するユーザーまたはサービスには、鍵バージョンに対する cloudkms.cryptoKeyVersions.viewPublicKey 権限が必要です。Cloud KMS ベータ版リリースの権限について詳しくは、権限と役割をご覧ください。

Console

既存の非対称鍵バージョンの公開鍵をダウンロードするには:

  1. GCP Console で [暗号鍵] ページを開きます。
  2. 非対称鍵を含む鍵リングの名前をクリックします。
  3. 鍵バージョンを含む鍵の名前をクリックします。
  4. 公開鍵の取得対象の鍵バージョンについて、その他アイコン(3 つの点が縦に並んだアイコン)をクリックします。
  5. [一般公開鍵の取得] をクリックします。公開鍵が表示されます。この公開鍵は、クリップボードにコピーしたりダウンロードしたりすることが可能です。[一般公開鍵の取得] オプションが表示されない場合は、鍵が非対称鍵であることと、cloudkms.cryptoKeyVersions.viewPublicKey 権限が付与されていることを確認します。

    公開鍵

GCP Console からダウンロードされる公開鍵のファイル名は [KEY_RING]-[KEY]-[CRYPTO_KEY_VERSION].pub という形式です。

コマンドライン

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

API

CryptoKeyVersions.getPublicKey メソッドを呼び出して公開鍵を取得します。

取得する公開鍵の鍵バージョンのリソース ID を指定します。

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...