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-----)입니다.
검증 시 다음 세 가지를 요청한 키 타입에 맞게 지정해야 합니다.
| 항목 | 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);