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

通常、非対称暗号化には以下の手順が含まれます。
  1. 署名者は公開鍵を受信者に送信します。
  2. 署名者は秘密鍵を使用してデータに署名します。
  3. 署名者はデータと署名を受信者に送信します。
  4. 受信者はデータと署名を受信した後、公開鍵を使用して署名を検証します。

始める前に

CreateKey 操作を呼び出して、KMS で非対称鍵を作成する必要があります。 非対称鍵を作成する際、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 で使用されるアルゴリズムと一致する必要があります。 たとえば、ECDSA_SHA_256 署名アルゴリズムは、SHA-256 ダイジェストアルゴリズムと組み合わせて使用する必要があります。 SHA-384 ダイジェストアルゴリズムはサポートしていません。

以下の例では、SHA-256 ダイジェストアルゴリズムを使用しています。

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

$ 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 の呼び出し

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

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

$ openssl base64 -in message-sha256.bin

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

hRP2cuRFSlfEoUXCGuPyi7kZr18VCTZeVOTw0jbUB6w=

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 鍵の場合、RSASSA_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

    SECG 曲線 secp256k1 の場合、ECDSA 署名アルゴリズムと SHA-256 ダイジェストアルゴリズムを使用して署名を作成できます。 以下のコマンドを実行します。

    $ 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 から取得します。 上記の例では、以下を前提としています。

  • RSA 鍵ペアの公開鍵は、ファイル rsa_publickey.pub に保存されます。
  • NIST P-256 鍵ペアの公開鍵は、ファイル ec_p256_publickey.pub に保存されます。
  • secp256k1 鍵ペアの公開鍵は、ファイル 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