--- title: "Get Public Key" slug: "security-kms2-token-public-key" updated: 2026-09-17T09:16:56Z published: 2026-09-17T09:16:56Z canonical: "api.ncloud-docs.com/security-kms2-token-public-key" --- > ## Documentation Index > Fetch the complete documentation index at: https://api.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # Get Public Key Classic/VPC 환경에서 이용 가능합니다. 공개 키를 조회합니다. RSA와 ECDSA 키 타입으로만 요청할 수 있습니다. ## 요청 요청 형식을 설명합니다. 요청 형식은 다음과 같습니다. | 메서드 | URI | | --- | --- | | POST | /kms/v1/keys/{keyTag}/get-pub-key | ### 요청 헤더 Key Management Service API에서 공통으로 사용하는 헤더에 대한 정보는 [Key Management Service 요청 헤더](/docs/security-kms#%EC%9A%94%EC%B2%AD%ED%97%A4%EB%8D%942%ED%86%A0%ED%81%B0%EC%9D%B8%EC%A6%9D)에서 토큰 인증 방식을 참조해 주십시오. ### 요청 경로 파라미터 요청 경로 파라미터에 대한 설명은 다음과 같습니다. | 필드 | 타입 | 필수 여부 | 설명 | | --- | --- | --- | --- | | `keyTag` | String | Required | 키 태그 - 키 이름에서 파생된 키의 고유 식별자 - [Get Key List](/docs/security-kms2-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 응답 상태 코드](/docs/security-kms#%EC%9D%91%EB%8B%B5%EC%83%81%ED%83%9C%EC%BD%94%EB%93%9C2)를 참조해 주십시오. ### 응답 예시 응답 예시는 다음과 같습니다. ``` { "code": "SUCCESS", "data": { "publicKey": "{PUBLIC_KEY_PEM}" } } ``` ## 공개 키로 서명 검증 조회한 공개 키로 [Sign](/docs/security-kms2-token-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](/docs/security-kms2-token-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](/docs/security-kms2-token-encrypt)를 이용하면 됩니다. 공개 키로 직접 암호화한 데이터도 위 조건과 동일하게 암호화했다면 [Decrypt](/docs/security-kms2-token-decrypt#%EA%B3%B5%EA%B0%9C%ED%82%A4%EC%95%94%ED%98%B8%ED%99%94%EB%B3%B5%ED%98%B8%ED%99%94)로 복호화할 수 있습니다.