全部产品
Search
文档中心

Key Management Service:Hasilkan dan verifikasi tanda tangan digital dengan menggunakan CMK asimetris

更新时间:Jul 06, 2025

Topik ini menjelaskan cara menggunakan Kunci Master Pelanggan (CMK) asimetris untuk menghasilkan dan memverifikasi tanda tangan digital. Dalam topik ini, CLI Alibaba Cloud digunakan, namun Anda juga dapat menggunakan SDK KMS.

Enkripsi asimetris mencakup langkah-langkah berikut:
  1. Penandatangan mengirimkan kunci publik ke penerima.
  2. Penandatangan menggunakan kunci privat untuk menandatangani data.
  3. Penandatangan mengirimkan data dan tanda tangan ke penerima.
  4. Setelah menerima data dan tanda tangan, penerima menggunakan kunci publik untuk memverifikasi tanda tangan.

Sebelum Anda mulai

Anda harus memanggil operasi CreateKey untuk membuat CMK asimetris di KMS. Saat membuat CMK asimetris, atur parameter KeySpec ke tipe kunci yang ingin digunakan dan setel parameter Usage ke SIGN/VERIFY.

  • Buat kunci tanda tangan RSA:

    aliyun kms CreateKey --KeySpec=RSA_2048 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
  • Buat kunci tanda tangan NIST P-256:

    aliyun kms CreateKey --KeySpec=EC_P256 --KeyUsage=SIGN/VERIFY --ProtectionLevel=HSM
  • Buat kunci tanda tangan secp256k1:

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

Pra-pemrosesan sebelum penandatanganan: Hitung digest pesan

Baik operasi penandatanganan RSA maupun ECC melibatkan penghitungan digest dari pesan yang belum ditandatangani terlebih dahulu, kemudian menandatangani digest tersebut.

Catatan Algoritma yang digunakan untuk menghitung digest pesan harus sesuai dengan algoritma yang ditentukan saat memanggil operasi API KMS untuk menghasilkan tanda tangan. Contohnya, algoritma tanda tangan ECDSA_SHA_256 harus digunakan bersamaan dengan algoritma digest SHA-256. Algoritma tanda tangan ECDSA_SHA_256 tidak kompatibel dengan algoritma digest SHA-384.

Dalam contoh-contoh berikut, algoritma digest SHA-256 digunakan.

1. Simpan pesan "this is message" yang perlu ditandatangani ke dalam file message-file.txt:

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

2. Hitung digest SHA-256 dari pesan dan simpan hasil biner ke dalam file message-sha256.bin:

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

Panggil operasi API KMS untuk menghasilkan tanda tangan

Anda harus memanggil operasi API KMS untuk menghasilkan tanda tangan pesan menggunakan kunci privat.

1. Sebelum mentransmisikan digest pesan melalui jaringan, enkode digest pesan dalam Base64.

openssl base64 -in message-sha256.bin

Berikut adalah hasil digest yang di-enkode Base64:

uCx5YpLfBrqoYMP8Hf9H7j9/1zT+PPxq1qJRW6uQbos=

2. Kirimkan digest yang di-enkode Base64 ke KMS untuk menghasilkan tanda tangan.

Catatan Parameter yang dikirimkan dan hasil yang dikembalikan bervariasi berdasarkan jenis kunci dan algoritma tanda tangan. Setiap hasil tanda tangan yang dikembalikan dalam contoh disimpan dalam file yang berbeda.
  • RSASSA-PSS

    Untuk kunci RSA, Anda dapat menggunakan algoritma tanda tangan RSASSA-PSS dan algoritma digest SHA-256 untuk menghasilkan tanda tangan. Jalankan perintah berikut:

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

    Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file rsa_pss_signature.bin:

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

    Untuk kunci RSA, Anda dapat menggunakan algoritma tanda tangan RSASSA_PKCS1_V1_5 dan algoritma digest SHA-256 untuk menghasilkan tanda tangan. Jalankan perintah berikut:

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

    Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file rsa_pkcs1_signature.bin:

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

    Untuk kurva NIST P-256, Anda dapat menggunakan algoritma tanda tangan ECDSA dan algoritma digest SHA-256 untuk menghasilkan tanda tangan. Jalankan perintah berikut:

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

    Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file ec_p256_signature.bin:

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

    Jalankan perintah berikut:

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

    Dekode nilai tanda tangan dalam Base64 dan hasilkan tanda tangan biner. Tanda tangan ini disimpan dalam file ec_p256k_signature.bin:

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

Peroleh kunci publik

Peroleh kunci publik dari CMK asimetris yang digunakan dari KMS. Untuk informasi lebih lanjut, lihat Peroleh Kunci Publik. Contoh-contoh sebelumnya mengasumsikan bahwa informasi berikut benar:

  • Kunci publik dari CMK RSA disimpan ke dalam file rsa_publickey.pub.
  • Kunci publik dari CMK NIST P-256 disimpan ke dalam file ec_p256_publickey.pub.
  • Kunci publik dari CMK secp256k1 disimpan ke dalam file ec_p256k_publickey.pub.

Gunakan kunci publik untuk memverifikasi tanda tangan

Jalankan perintah berikut untuk memverifikasi tanda tangan. Perintah-perintah tersebut bervariasi berdasarkan jenis kunci dan algoritma tanda tangan yang digunakan.

  • 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

Jika tanda tangan lolos verifikasi, sistem akan mengembalikan pesan berikut:

Verified OK