全部产品
Search
文档中心

Key Management Service:Gunakan KMS CMK untuk mengenkripsi dan mendekripsi data

更新时间:Jul 06, 2025

Anda harus mengenkripsi data sensitif pada aset TI yang diterapkan di Alibaba Cloud. Anda dapat memanggil operasi API kriptografi dari Key Management Service (KMS) untuk mengenkripsi atau mendekripsi data kurang dari 6 KB. Topik ini menjelaskan cara memanggil operasi API KMS untuk mengenkripsi dan mendekripsi kunci privat sertifikat SSL.

Informasi latar belakang

Anda dapat menggunakan kunci master pelanggan (CMK) untuk mengenkripsi dan mendekripsi data dalam skenario berikut, namun tidak terbatas pada:

  • Mengenkripsi file konfigurasi.

  • Mengenkripsi kunci privat sertifikat SSL.

Arsitektur

Data pengguna dikirim ke server KMS melalui saluran aman. Server KMS mengenkripsi atau mendekripsi data dan mengembalikan hasilnya kepada pengguna melalui saluran aman. Gambar berikut menunjukkan seluruh prosedur. Using KMS CMK to encrypt and decrypt data_Network architecture diagramProsedur:

  1. Buat CMK di KMS console atau dengan memanggil operasi CreateKey.

  2. Panggil operasi Encrypt dari KMS untuk mengenkripsi kunci privat sertifikat SSL. Kunci privat ciphertext akan dikembalikan.

  3. Sebarkan sertifikat SSL menggunakan kunci privat ciphertext ke instance Elastic Compute Service (ECS).

  4. Panggil operasi Decrypt dari KMS untuk mendekripsi ciphertext ketika instance ECS mulai dan perlu menggunakan sertifikat SSL.

Operasi API terkait

Anda dapat memanggil operasi API berikut untuk mengenkripsi dan mendekripsi data.

Operasi

Deskripsi

CreateKey

Membuat CMK.

CreateAlias

Membuat alias untuk CMK.

Encrypt

Mengenkripsi data menggunakan CMK.

Decrypt

Mendekripsi data yang dienkripsi oleh KMS. Anda tidak perlu menentukan CMK.

Mengenkripsi dan mendekripsi kunci privat sertifikat SSL

Catatan

Pair AccessKey akun Alibaba Cloud memiliki izin pada semua operasi API. Menggunakan pair AccessKey untuk melakukan operasi adalah operasi berisiko tinggi. Kami merekomendasikan Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin. Kami juga merekomendasikan agar Anda tidak menyimpan ID AccessKey dan Secret AccessKey di kode proyek Anda. Jika tidak, pair AccessKey mungkin bocor dan keamanan semua sumber daya yang dimiliki oleh akun Anda mungkin terganggu.

Dalam contoh ini, pair AccessKey disimpan dalam variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET untuk mengimplementasikan otentikasi identitas.

  1. Panggil operasi CreateKey untuk membuat CMK.

    aliyun kms CreateKey

    Output yang Diharapkan:

    {
      "KeyMetadata": {
        "CreationDate": "2019-04-08T07:45:54Z",
        "Description": "",
        "KeyId": "1234abcd-12ab-34cd-56ef-12345678****",
        "KeyState": "Enabled",
        "KeyUsage": "ENCRYPT/DECRYPT",
        "DeleteDate": "",
        "Creator": "151266687691****",
        "Arn": "acs:kms:cn-hangzhou:151266687691****:key/1234abcd-12ab-34cd-56ef-12345678****",
        "Origin": "Aliyun_KMS",
        "MaterialExpireTime": ""
      },
      "RequestId": "2a37b168-9fa0-4d71-aba4-2077dd9e80df"
    }
  2. (Opsional)Buat alias untuk CMK. Kami merekomendasikan Anda melakukan langkah ini.

    Alias secara opsional digunakan untuk mengidentifikasi CMK. Jika CMK tidak memiliki alias, Anda dapat menggunakan ID CMK untuk mengidentifikasi CMK.

    aliyun kms CreateAlias --AliasName alias/Apollo/WorkKey --KeyId 1234abcd-12ab-34cd-56ef-12345678****
    Catatan

    Dalam contoh ini, alias Apollo/WorkKey dibuat untuk CMK di proyek Apollo. Alias ini digunakan dalam kode sampel berikutnya. Anda dapat menggunakan alias/Apollo/WorkKey untuk merujuk CMK saat Anda memanggil operasi Encrypt.

  3. Panggil operasi Encrypt untuk mengenkripsi kunci privat sertifikat SSL. Kemudian, KMS mengenkripsi kunci privat.

    Dalam kode sampel berikut:

    • alias/Apollo/WorkKey adalah alias dari CMK.

    • ./certs/key.pem adalah kunci privat plaintext.

    • ./certs/key.pem.cipher adalah kunci privat ciphertext.

    #!/usr/bin/env python
    #coding=utf-8
    
    import json
    
    from aliyunsdkcore import client
    from aliyunsdkkms.request.v20160120 import EncryptRequest
    from aliyunsdkkms.request.v20160120 import DecryptRequest
    
    def KmsEncrypt(client, plaintext, key_alias):
      request = EncryptRequest.EncryptRequest()
      request.set_accept_format('JSON')
      request.set_KeyId(key_alias)
      request.set_Plaintext(plaintext)
      response = json.loads(client.do_action(request))
      return response.get("CiphertextBlob")
    
    def ReadTextFile(in_file):
      file = open(in_file, 'r')
      content = file.read()
      file.close()
      return content
    
    def WriteTextFile(out_file, content):
      file = open(out_file, 'w')
      file.write(content)
      file.close()
    
    clt = client.AcsClient(os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'<Region-Id>')
    
    key_alias = 'alias/Apollo/WorkKey'
    
    in_file = './certs/key.pem'
    out_file = './certs/key.pem.cipher'
    
    # Baca file kunci privat dalam mode teks
    in_content = ReadTextFile(in_file)
    
    # Enkripsi
    ciphertext = KmsEncrypt(clt, in_content, key_alias)
    
    # Tulis file kunci terenkripsi dalam mode teks
    WriteTextFile(out_file, ciphertext)
  4. Panggil operasi Decrypt untuk mendekripsi kunci privat ciphertext. Kemudian, KMS mendekripsi kunci privat yang telah Anda sebarkan ke instance ECS Anda.

    Dalam kode sampel berikut:

    • ./certs/key.pem.cipher adalah kunci privat ciphertext.

    • ./certs/decrypted_key.pem adalah kunci privat plaintext.

    #!/usr/bin/env python
    #coding=utf-8
    
    import json
    
    from aliyunsdkcore import client
    from aliyunsdkkms.request.v20160120 import EncryptRequest
    from aliyunsdkkms.request.v20160120 import DecryptRequest
    
    def KmsDecrypt(client, ciphertext):
      request = DecryptRequest.DecryptRequest()
      request.set_accept_format('JSON')
      request.set_CiphertextBlob(ciphertext)
      response = json.loads(client.do_action(request))
      return response.get("Plaintext")
    
    def ReadTextFile(in_file):
      file = open(in_file, 'r')
      content = file.read()
      file.close()
      return content
    
    def WriteTextFile(out_file, content):
      file = open(out_file, 'w')
      file.write(content)
      file.close()
    
    clt = client.AcsClient(os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),'<Region-Id>')
    
    in_file = './certs/key.pem.cipher'
    out_file = './certs/decrypted_key.pem'
    
    # Baca file kunci terenkripsi dalam mode teks
    in_content = ReadTextFile(in_file)
    
    # Dekripsi
    ciphertext = KmsDecrypt(clt, in_content)
    
    # Tulis file kunci terdekripsi dalam mode teks
    WriteTextFile(out_file, ciphertext)