最新のコンテンツが反映されていません。早急にアップデート内容をご提供できるよう努めております。最新のコンテンツ内容は韓国語ページをご参照ください。
Classic/VPC環境で利用できます。
公開鍵を照会します。RSAと ECDSAキータイプでのみリクエストできます。
リクエスト
リクエスト形式を説明します。リクエスト形式は次の通りです。
| メソッド | URI |
|---|---|
| POST | /kms/v1/keys/{keyTag}/get-pub-key |
リクエストヘッダ
Key Management Service APIで共通して使用されるヘッダの詳細は、Key Management Serviceのリクエストヘッダでトークン認証方式をご参照ください。
リクエストパスパラメータ
リクエストパスパラメータの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
keyTag |
String | Required | キータグ
|
リクエストボディ
リクエストボディの説明は次の通りです。
| フィールド | タイプ | 必須の有無 | 説明 |
|---|---|---|---|
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);