Get Public Key

Prev Next

Classic/VPC 환경에서 이용 가능합니다.

공개 키를 조회합니다. RSA 또는 ECDSA 키 타입으로만 요청할 수 있습니다.

주의

공개 키를 KMS 밖에서 직접 사용하면 KMS 의 권한 확인, 키 상태 확인, 활동 로그가 적용되지 않으므로 주의해 주십시오. 예를 들어 키 버전을 비활성화하거나 키를 삭제해도, 이미 조회해 둔 공개 키로는 계속 데이터를 암호화하거나 서명을 검증할 수 있습니다.

공개 키를 직접 보관해 사용할 필요가 없다면 KMS 의 Encrypt와 Verify를 이용해 주십시오.

요청

요청 형식을 설명합니다. 요청 형식은 다음과 같습니다.

메서드 URI
POST /kms/v1/keys/{keyTag}/get-pub-key

요청 헤더

Key Management Service API에서 공통으로 사용하는 헤더에 대한 정보는 Key Management Service 요청 헤더에서 토큰 인증 방식을 참조해 주십시오.

요청 경로 파라미터

요청 경로 파라미터에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
keyTag String Required 키 태그
  • 키 이름에서 파생된 키의 고유 식별자
  • Get Key List 참조
  • REST API로 암호화 또는 복호화 요청 시 사용
  • 키 태그는 기밀 정보로 취급되지 않음

요청 바디

요청 바디에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
keyVersion Integer Optional 조회할 키 버전
  • 미입력 시 키의 최신 버전을 조회함
  • 비활성화된 키 버전은 조회 불가

요청 예시

요청 예시는 다음과 같습니다.

curl --location --request POST 'https://ocapi.gov-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)는 자동 추론을 지원하지 않으므로 반드시 salt 길이를 명시해 주십시오.

검증 예시

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);
참고

KCMVP 인증 키 타입(KCMVP_RSA2048, KCMVP_ECDSA)의 검증 방법은 위와 동일합니다. 서명 파라미터를 직접 지정하지 않으려면 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);
참고

KCMVP 인증 키 타입(KCMVP_RSA2048)의 암호화 조건도 위와 동일합니다. KMS API로 암호화하는 경우에는 이 과정 없이 Encrypt를 이용하면 됩니다. 공개 키로 직접 암호화한 데이터도 위 조건과 동일하게 암호화했다면 Decrypt{target="_blank"}로 복호화할 수 있습니다.