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 키 태그
  • 키 이름에서 파생된 키의 고유 식별자
  • 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-----)입니다.

검증 시 다음 세 가지를 요청한 키 타입에 맞게 지정해야 합니다.

항목 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로 복호화할 수 있습니다.