Get Public Key

Prev Next

最新のコンテンツが反映されていません。早急にアップデート内容をご提供できるよう努めております。最新のコンテンツ内容は韓国語ページをご参照ください。

Classic/VPC環境で利用できます。

公開鍵を照会します。RSAと ECDSAキータイプでのみリクエストできます。

リクエスト

リクエスト形式を説明します。リクエスト形式は次の通りです。

メソッド URI
POST /kms/v1/keys/{keyTag}/get-pub-key

リクエストヘッダ

Key Management Service APIで共通して使用されるヘッダの詳細は、Key Management Serviceのリクエストヘッダでトークン認証方式をご参照ください。

リクエストパスパラメータ

リクエストパスパラメータの説明は次の通りです。

フィールド タイプ 必須の有無 説明
keyTag String Required キータグ
  • キー名から派生したキーの固有 ID
  • Get Key Listを参照
  • REST APIで暗号化または復号化をリクエストする際に使用
  • キータグは機密情報として扱われない

リクエストボディ

リクエストボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
keyVersion Integer Optional 照会対象キーのバージョン
  • 入力しないとキーの最新バージョンが表示される
  • 無効化したキーのバージョンは照会不可

リクエスト例

リクエストのサンプルコードは次の通りです。

curl --location --request POST 'https://ocapi.ncloud.com/kms/v1/keys/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6/get-pub-key' \
--header 'x-ncp-ocapi-token: {Access Token}' \
--data '{
  "keyVersion": 2
}'

レスポンス

レスポンス形式を説明します。

レスポンスボディ

レスポンスボディの説明は次の通りです。

フィールド タイプ 必須の有無 説明
code String - 成功したかどうか
data Object - レスポンス結果
data.publicKey String - 公開鍵

レスポンスステータスコード

Key Management Service APIで共通して使用されるレスポンスステータスコードの詳細は、Key Management Serviceのレスポンスステータスコードをご参照ください。

レスポンス例

レスポンスのサンプルコードは次の通りです。

{
    "code": "SUCCESS",
    "data": {
        "publicKey": "{PUBLIC_KEY_PEM}"
    }
}

公開鍵による署名検証

照会した公開鍵でSignが作成した署名値を直接検証する方法を説明します。

data.publicKeyはX.509 SubjectPublicKeyInfo構造のPEM文字列(-----BEGIN PUBLIC KEY-----)です。

検証時は次の3つをリクエストしたキータイプに合わせて指定する必要があります。

項目 RSA2048 ECDSA
署名アルゴリズム RSASSA-PSS SHA256withECDSA
署名パラメータ SHA-256、MGF1(SHA-256)、Salt長222バイト、trailer field 1 別途パラメータなし
署名値のエンコーディング 固定256バイト ASN.1 DER

Salt長222バイトはRSA-PSSの最大Salt長であり、ceil((2048 - 1) / 8) - 32 - 2 = 222で算出されます。OpenSSL、Go、Node.jsは検証時に署名値からSalt長を自動的に推論しますが、Java(JCA)は自動推論をサポートしないため、必ず明示する必要があります。

検証例

Javaで署名値を検証する例は次の通りです。

// 1. 公開鍵(PEM)のパース
String base64Key = publicKey
        .replace("-----BEGIN PUBLIC KEY-----", "")
        .replace("-----END PUBLIC KEY-----", "")
        .replaceAll("\\s", "");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(base64Key));

// 2. 署名値から "ncpkms:v{キーバージョン}:" プレフィックスを除去してからBase64デコード
byte[] signatureBytes = Base64.getDecoder()
        .decode(signature.substring(signature.lastIndexOf(':') + 1));

// 3. 署名対象データ — Signリクエストのdataをbase64デコードした元のバイト列
byte[] data = Base64.getDecoder().decode(base64Data);
  • RSA2048キー
PublicKey key = KeyFactory.getInstance("RSA").generatePublic(keySpec);

Signature verifier = Signature.getInstance("RSASSA-PSS");
verifier.setParameter(new PSSParameterSpec(
        "SHA-256",
        "MGF1",
        MGF1ParameterSpec.SHA256,
        222,    // RSA-PSSの最大Salt長 (RSA2048 + SHA-256)
        1
));
verifier.initVerify(key);
verifier.update(data);

boolean valid = verifier.verify(signatureBytes);
  • ECDSAキー
PublicKey key = KeyFactory.getInstance("EC").generatePublic(keySpec);

Signature verifier = Signature.getInstance("SHA256withECDSA");
verifier.initVerify(key);
verifier.update(data);

boolean valid = verifier.verify(signatureBytes);
参考

署名パラメータを直接合わせる必要がないようにするには、Verifyをご利用ください。

公開鍵による暗号化

照会した公開鍵でデータを直接暗号化する方法を説明します。NCP KMSのRSA2048キータイプでのみ可能です。ECDSAキータイプは署名・検証(SIGN_VERIFY)専用として提供され、暗号化機能はサポートしません。

暗号化時は次の条件を指定する必要があります。

項目 値
アルゴリズム RSAES-OAEP
OAEPハッシュ SHA-256
MGF MGF1 with SHA-256
Label なし
平文の最大サイズ 190 bytes

暗号化例

Javaで公開鍵を利用してデータを暗号化する例は次の通りです。

// 1. 公開鍵(PEM)のパース
String base64Key = publicKey
        .replace("-----BEGIN PUBLIC KEY-----", "")
        .replace("-----END PUBLIC KEY-----", "")
        .replaceAll("\\s", "");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(base64Key));
PublicKey key = KeyFactory.getInstance("RSA").generatePublic(keySpec);

// 2. 暗号化 — 平文は最大190 bytes
OAEPParameterSpec spec = new OAEPParameterSpec(
        "SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertextBytes = cipher.doFinal(plaintext);

// 3. Decrypt APIで復号化するには "ncpkms:v{キーバージョン}:" プレフィックスを付けて渡す
String ciphertext = "ncpkms:v" + keyVersion + ":" + Base64.getEncoder().encodeToString(ciphertextBytes);
参考

KMS APIで暗号化する場合はこの過程なしにEncryptを利用すればよいです。公開鍵で直接暗号化したデータも上記の条件と同様に暗号化していれば、Decryptで復号化できます。