이 주제에서는 비대칭 키를 기반으로 한 디지털 서명 생성 및 검증에 대한 정보를 제공합니다.
디지털 서명은 비대칭 키의 비공개 키 부분을 사용하여 생성됩니다. 서명은 동일한 비대칭 키의 공개 키 부분을 사용하여 검증됩니다.
시작하기 전에
- 디지털 서명을 만들 때는 키 용도가 - ASYMMETRIC_SIGN인 키를 사용해야 합니다. 키를 만들 때는- ASYMMETRIC_SIGN을 사용합니다.
- 서명을 확인하려면 키를 만들 때 사용한 전체 알고리즘을 알아야 합니다. 아래의 - openssl명령어를 사용하는 명령줄 안내의 경우 이 정보를 해당 명령어에 전달해야 합니다.
- 서명을 수행할 사용자 또는 서비스에 비대칭 키에 대한 - cloudkms.cryptoKeyVersions.useToSign권한을 부여합니다. Cloud Key Management Service의 권한은 권한 및 역할에서 확인할 수 있습니다.
- 서명을 검증하려면 검증에 사용할 공개 키를 다운로드할 사용자 또는 서비스에 비대칭 키에 대한 - cloudkms.cryptoKeyVersions.viewPublicKey권한을 부여합니다.
- 명령줄을 사용하려고 하지만 OpenSSL을 아직 설치하지 않았으면 설치합니다. Cloud Shell을 사용하는 경우에는 OpenSSL이 이미 설치되어 있습니다. 
데이터와 다이제스트 비교
AsymmetricSign 요청에 제공된 입력은 data 필드 또는 digest 필드를 통해 전달될 수 있습니다. 두 필드를 동시에 지정할 수는 없습니다. 원시 알고리즘 및 Cloud 외부 키 관리자 키로 서명하는 것과 같이 데이터 필드가 필요한 몇 가지 알고리즘이 있습니다.
원시 알고리즘
RSA_SIGN_RAW_ 프리픽스로 식별되는 '원시' 알고리즘은 DigestInfo로의 인코딩을 생략하는 PKCS #1 서명의 변형입니다. 이 변형은 다음과 같은 특징이 있습니다.
- 다이제스트는 서명될 메시지를 대상으로 계산됩니다.
- PKCS #1 패딩은 다이제스트에 직접 적용됩니다.
- 패딩된 다이제스트의 서명은 RSA 비공개 키를 사용하여 계산됩니다.
이러한 알고리즘을 사용하려면 다음 안내를 따르세요.
- data필드의 일부로 다이제스트 대신 원시 데이터를 제공해야 합니다.
- 데이터의 길이 한도는 RSA 키 크기보다 11바이트 적습니다. 예를 들어, 2048비트 RSA 키가 있는 PKCS #1은 최대 245바이트에 서명할 수 있습니다.
- cloudkms.expertRawPKCS1역할을 적절한 사용자 또는 서비스에 부여합니다. Cloud Key Management Service의 권한은 권한 및 역할에서 확인할 수 있습니다.
원시 알고리즘을 사용하면 사전 정의된 알고리즘을 사용할 수 없는 다이제스트 유형에 서명할 수도 있습니다. 예를 들어 RSA_SIGN_RAW_2048 키를 사용하여 이미 외부에서 계산한 SHA-512 PKCS #1 DigestInfo 구조에 서명할 수 있습니다. 이 프로세스는 표준 RSA_SIGN_PKCS1_2048_SHA512 알고리즘과 동일한 결과를 생성합니다.
기타 해시 알고리즘에 대한 ECDSA 지원
ECDSA 서명 알고리즘은 일반적인 형식을 가집니다.
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
DIGEST_ALGORITHM의 값이 SHA256, SHA384 또는 SHA512입니다.
해시는 서명을 만들기 전에 실행되므로 이러한 서명 알고리즘은 Keccak과 같은 SHA 이외의 다이제스트와도 사용할 수 있습니다. Keccak 다이제스트를 사용하려면 Keccak 해시 값을 제공하고 동일한 길이의 SHA 다이제스트 알고리즘을 사용합니다. 예를 들어 EC_SIGN_P256_SHA256 알고리즘을 사용하는 요청에서 KECCAK256 다이제스트를 사용할 수 있습니다.
서명 만들기
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
gcloud kms asymmetric-sign \
    --version key-version \
    --key key \
    --keyring key-ring \
    --location location \
    --digest-algorithm digest-algorithm \
    --input-file input-file \
    --signature-file signature-file
key-version을 서명에 사용할 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. digest-algorithm을 사용할 알고리즘으로 바꿉니다. digest-algorithm을 생략하여 input-file을 서명할 Cloud KMS로 보냅니다. input-file 및 signature-file을 서명할 파일의 로컬 경로와 서명 파일을 대체합니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help 플래그와 함께 명령어를 실행하세요.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Cloud KMS Go SDK를 설치합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK를 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
API
이 예시에서는 curl을 HTTP 클라이언트로 사용하여 API 사용을 보여줍니다. 액세스 제어에 대한 자세한 내용은 Cloud KMS API 액세스를 참조하세요.
CryptoKeyVersions.asymmetricSign 메서드를 사용하여 서명을 수행합니다. 이 메서드의 응답에는 base64 인코딩 서명이 포함됩니다.
타원 곡선 서명 검증
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
공개 키 가져오기
gcloud kms keys versions get-public-key key-version \
    --key key \
    --keyring key-ring \
    --location location \
    --output-file output-file
key-version을 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. output-file를 로컬 시스템에 공개 키를 저장할 파일 경로로 바꿉니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help 플래그와 함께 명령어를 실행하세요.
서명 확인
서명을 검증하는 OpenSSL 명령어는 생성된 서명 유형에 따라 달라집니다. 예를 들어 OpenSSL을 사용하여 SHA-256 타원 곡선 서명을 검증하려면 -sha256을 지정해야 합니다. SHA-384 타원 곡선 서명의 유효성을 검사하려면 -sha384를 지정해야 합니다.
openssl dgst \
    -sha256 \
    -verify public-key-file \
    -signature signature-file \
    message-file
변수를 자체 값으로 바꿉니다.
- public-key-file. 공개 키를 포함하는 파일의 경로입니다(예: - "./my-key.pub").
- signature-file. 확인할 서명을 포함하는 파일의 경로입니다(예: - "./my-data.sig").
- message-file. 메시지를 포함하는 파일의 경로입니다(예: - "./my-data.txt").
서명이 유효한 경우 명령은 문자열 Verified OK를 출력합니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 help 하위 명령어와 함께 명령어를 실행하세요.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Cloud KMS Go SDK를 설치합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK를 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
API
이 예시에서는 curl을 HTTP 클라이언트로 사용하여 API 사용을 보여줍니다. 액세스 제어에 대한 자세한 내용은 Cloud KMS API 액세스를 참조하세요.
CryptoKeyVersions.getPublicKey 메서드를 사용하여 공개 키를 검색한 후 명령줄 예시에 있는 명령어를 사용하여 서명을 검증합니다.
RSA 서명 검증
gcloud
명령줄에서 Cloud KMS를 사용하려면 먼저 최신 버전의 Google Cloud CLI로 설치 또는 업그레이드하세요.
공개 키 가져오기
gcloud kms keys versions get-public-key key-version \
    --key key \
    --keyring key-ring \
    --location location \
    --output-file output-file
key-version을 키 버전으로 바꿉니다. key를 키 이름으로 바꿉니다. key-ring을 키가 배치된 키링의 이름으로 바꿉니다. location을 키링의 Cloud KMS 위치로 바꿉니다. output-file를 로컬 시스템에 공개 키를 저장할 경로로 바꿉니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 --help 플래그와 함께 명령어를 실행하세요.
서명 확인
서명을 검증하는 OpenSSL 명령어는 생성된 서명 유형에 따라 달라집니다. 예를 들어 PSS 패딩으로 SHA-256 RSA 서명을 검증하려면 -sha256 및 -sigopt rsa_padding_mode:pss를 지정해야 합니다. PSS 패딩으로 SHA-512 RSA 서명의 유효성을 검사하려면 -sha512 및 -sigopt
rsa_padding_mode:pss를 지정해야 합니다.
openssl dgst \
    -sha256 \
    -sigopt rsa_padding_mode:pss \
    -sigopt rsa_pss_saltlen:-1 \
    -verify public-key-file \
    -signature signature-file \
    message-file
변수를 자체 값으로 바꿉니다.
- public-key-file. 공개 키를 포함하는 파일의 경로입니다(예: - "./my-key.pub").
- signature-file. 확인할 서명을 포함하는 파일의 경로입니다(예: - "./my-data.sig").
- message-file. 메시지를 포함하는 파일의 경로입니다(예: - "./my-data.txt").
서명이 유효한 경우 명령은 문자열 Verified OK를 출력합니다.
모든 플래그 및 가능한 값에 대한 정보를 보려면 help 하위 명령어와 함께 명령어를 실행하세요.
C#
이 코드를 실행하려면 먼저 C# 개발 환경을 설정하고 Cloud KMS C# SDK를 설치합니다.
Go
이 코드를 실행하려면 먼저 Go 개발 환경을 설정하고 Cloud KMS Go SDK를 설치합니다.
Java
이 코드를 실행하려면 먼저 자바 개발 환경을 설정하고 Cloud KMS 자바 SDK를 설치합니다.
Node.js
이 코드를 실행하려면 먼저 Node.js 개발 환경을 설정하고 Cloud KMS Node.js SDK를 설치합니다.
PHP
이 코드를 실행하려면 먼저 Google Cloud에서 PHP 사용에 관해 알아보고 Cloud KMS PHP SDK를 설치하세요.
Python
이 코드를 실행하려면 먼저 Python 개발 환경을 설정하고 Cloud KMS Python SDK를 설치합니다.
Ruby
이 코드를 실행하려면 먼저 Ruby 개발 환경을 설정하고 Cloud KMS Ruby SDK를 설치합니다.
API
이 예시에서는 curl을 HTTP 클라이언트로 사용하여 API 사용을 보여줍니다. 액세스 제어에 대한 자세한 내용은 Cloud KMS API 액세스를 참조하세요.
CryptoKeyVersions.getPublicKey 메서드를 사용하여 공개 키를 검색한 후 명령줄 예시에 있는 명령어를 사용하여 서명을 검증합니다.