すべてのプロダクト
Search
ドキュメントセンター

Key Management Service:非対称CMKを使用したデジタル署名の生成と検証

最終更新日:Jan 20, 2025

このトピックでは、非対称顧客マスターキー (CMK) を使用してデジタル署名を生成および検証する方法について説明します。 このトピックでは、Alibaba Cloud CLIを使用します。 KMS SDKを使用することもできます。

非対称暗号化には次の手順があります。
  1. 署名者が公開鍵を受信者に送信します。
  2. 署名者は秘密鍵を使用してデータに署名します。
  3. 署名者はデータと署名を受信者に送信します。
  4. 受信者がデータおよび署名を受信した後、受信者は公開鍵を使用して署名を検証する。

始める前に

KMSで非対称CMKを作成するには、CreateKey操作を呼び出す必要があります。 非対称CMKを作成するときは、KeySpecパラメーターを使用するキータイプに設定し、UsageパラメーターをSIGN/VERIFYに設定します。

  • RSA 署名鍵を作成します。

    aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
  • NIST P-256 署名鍵を作成します。

    aliyun kms CreateKey --KeySpec=EC_P256 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
  • secp256k1 署名鍵を作成します。

    aliyun kms CreateKey --KeySpec=EC_P256K --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM

署名前の前処理: メッセージダイジェストの計算

RSA と ECC の署名操作では、署名のないメッセージのダイジェストを計算してから、ダイジェストに署名します。

説明 メッセージダイジェストの計算に使用されるアルゴリズムは、署名を生成するためにKMS API操作を呼び出すときに指定されたアルゴリズムと一致する必要があります。 たとえば、ECDSA_SHA_256 署名アルゴリズムは、SHA-256 ダイジェストアルゴリズムと組み合わせて使用する必要があります。 ECDSA_SHA_256署名アルゴリズムは、SHA-384ダイジェストアルゴリズムと一致しません。

以下の例では、SHA-256ダイジェストアルゴリズムが使用される。

1. message-file.txtファイルに署名する必要がある「this is message」メッセージを保存します。

echo "this is message" > message-file.txt

2. メッセージのSHA-256ダイジェストを計算し、バイナリダイジェストをmessage-sha256.binファイルに保存します。

openssl dgst -sha256 -binary -out message-sha256.bin  message-file.txt

KMS APIを呼び出して署名を生成する

KMS APIを呼び出して、秘密鍵を使用してメッセージの署名を生成する必要があります。

1. ネットワーク経由でメッセージダイジェストを送信する前に、Base64でメッセージダイジェストをエンコードします。

openssl base64 -in message-sha256.bin

Base64 でエンコードされた以下のダイジェストが返されます。

uCx5YpLfBrqoYMP8Hf9H7j9/1zT+PPxq1qJRW6uQbos=

2. Base64エンコードされたダイジェストをKMSに渡して署名を生成します。

説明 渡されるパラメーターと返される結果は、キーの種類と署名アルゴリズムによって異なります。 この例で返される各署名結果は、異なるファイルに格納されます。
  • RSASSA-PSS

    RSAキーの場合、RSASSA-PSS署名アルゴリズムとSHA-256ダイジェストアルゴリズムを使用して署名を生成できます。 以下のコマンドを実行します。

    aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \
        --Algorithm=RSA_PSS_SHA_256 --Digest=hRP2cu...
    {
            "KeyId": "****",
            "KeyVersionId": "****",
            "Value": "J7xmdnZ...",
            "RequestId": "70f78da9-c1b6-4119-9635-0ce4427cd424"
    }

    Base64 で署名値をデコードし、バイナリ署名を生成します。 この署名は、ファイル rsa_pss_signature.bin に保存されます。

    echo J7xmdnZ... | openssl base64 -d -out rsa_pss_signature.bin
  • RSASSA_PKCS1_V1_5

    RSAキーの場合、RSASA_PKCS1_V1_5署名アルゴリズムとSHA-256ダイジェストアルゴリズムを使用して署名を生成できます。 以下のコマンドを実行します。

    aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \
        --Algorithm=RSA_PKCS1_SHA_256 --Digest=hRP2cu...
    {
            "KeyId": "****",
            "KeyVersionId": "****",
            "Value": "qreBkH/u...",
            "RequestId": "4be57288-f477-4ecd-b7be-ad8688390fbc"
    }

    Base64 で署名値をデコードし、バイナリ署名を生成します。 この署名は、ファイル rsa_pkcs1_signature.bin に保存されます。

    echo qreBkH/u... | openssl base64 -d -out rsa_pkcs1_signature.bin
  • NIST P-256

    NISTカーブP-256では、ECDSA署名アルゴリズムとSHA-256ダイジェスト署名を使用して署名を生成できます。 以下のコマンドを実行します。

    aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \
        --Algorithm=ECDSA_SHA_256 --Digest=hRP2cu...
    {
            "KeyId": "****",
            "KeyVersionId": "****",
            "Value": "MEYCIQD33Y98...",
            "RequestId": "472d789c-d4be-4271-96bb-367f7f0f8ec3"
    }

    Base64 で署名値をデコードし、バイナリ署名を生成します。 この署名は、ファイル ec_p256_signature.bin に保存されます。

    echo MEYCIQD33Y98... | openssl base64 -d -out ec_p256_signature.bin
  • secp256k1

    以下のコマンドを実行します。

    aliyun kms AsymmetricSign --KeyId=**** --KeyVersionId=**** \
        --Algorithm=ECDSA_SHA_256 --Digest=hRP2cu...
    {
            "KeyId": "****",
            "KeyVersionId": "****",
            "Value": "MEYCIQDWuuI...",
            "RequestId": "fe41abed-91e7-4069-9f6b-0048f5bf4de5"
    }

    Base64 で署名値をデコードし、バイナリ署名を生成します。 この署名は、ファイル ec_p256k_signature.bin に保存されます。

    echo MEYCIQDWuuI... | openssl base64 -d -out ec_p256k_signature.bin

公開鍵の取得

KMSから使用される非対称CMKの公開鍵を取得します。 詳細については、「公開鍵の取得」をご参照ください。 上記の例では、次の情報がtrueであると想定しています。

  • RSA CMKの公開鍵はrsa_publickey.pubファイルに保存されます。
  • NIST P-256 CMKの公開鍵は、ファイルec_p256_publickey.pubに保存されます。
  • secp256k1 CMKの公開鍵は、ファイルec_p256k_publickey.pubに保存されます。

公開鍵による署名の検証

次のコマンドを実行して署名を確認します。 コマンドは、使用されるキータイプと署名アルゴリズムによって異なります。

  • RSASSA-PSS
    openssl dgst \
        -verify rsa_publickey.pub \
        -sha256 \
        -sigopt rsa_padding_mode:pss \
        -sigopt rsa_pss_saltlen:-1 \
        -signature rsa_pss_signature.bin \
        message-file.txt
  • RSASSA_PKCS1_V1_5
    openssl dgst \
        -verify rsa_publickey.pub \
        -sha256 \
        -signature rsa_pkcs1_signature.bin \
        message-file.txt
  • NIST P-256
    openssl dgst \
        -verify ec_p256_publickey.pub \
        -sha256 \
        -signature ec_p256_signature.bin \
        message-file.txt
  • secp256k1
    openssl dgst \
        -verify ec_p256k_publickey.pub \
        -sha256 \
        -signature ec_p256k_signature.bin \
        message-file.txt

署名が検証に合格した場合、システムは次のメッセージを返します。

Verified OK