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

Key Management Service:KMS CMKを使用したデータの暗号化と復号化

最終更新日:Jan 20, 2025

Alibaba CloudにデプロイされているITアセットの機密データを暗号化する必要があります。 Key Management Service (KMS) の暗号化API操作を呼び出して、6 KB未満のデータを暗号化または復号化できます。 このトピックでは、KMSのAPI操作を呼び出してSSL証明書の秘密鍵を暗号化および復号化する方法について説明します。

背景情報

次のシナリオでは、顧客マスターキー (CMK) を使用してデータを暗号化および復号できますが、これに限定されません。

  • 設定ファイルの暗号化

  • SSL証明書の秘密鍵を暗号化します。

アーキテクチャ

ユーザーのデータは、安全なチャネルを介してKMSサーバーに送信されます。 KMSサーバーはデータを暗号化または復号化し、その結果を安全なチャネルを介してユーザーに返します。 下図にプロセスを示します。 Using KMS CMK to encrypt and decrypt data_Network architecture diagramのプロシージャ:

  1. KMSコンソールで、またはCreateKey操作を呼び出してCMKを作成します。

  2. KMSのEncrypt操作を呼び出して、SSL証明書の秘密鍵を暗号化します。 暗号文の秘密鍵が返されます。

  3. 暗号文秘密鍵を使用して、ECS (Elastic Compute Service) インスタンスにSSL証明書をデプロイします。

  4. ECSインスタンスが起動し、SSL証明書を使用する必要があるときに、KMSのDecrypt操作を呼び出して暗号文を復号します。

関連する API 操作

データを暗号化および復号化するには、以下の API を呼び出します。

API 操作

説明

CreateKey

CMK を作成します。

CreateAlias

CMK のエイリアスを作成します。

暗号化

CMKを使用してデータを暗号化します。

解読

KMS によって暗号化されたデータを復号します。 CMK を指定する必要はありません。

SSL 証明書の秘密鍵を暗号化および復号する

説明

Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 AccessKeyペアを使用して操作を実行することは、リスクの高い操作です。 RAMユーザーを使用してAPI操作を呼び出したり、ルーチンのO&Mを実行することを推奨します。プロジェクトコードにAccessKey IDとAccessKey Secretを保存しないことを推奨します。 そうしないと、AccessKeyペアが漏洩し、アカウントに属するすべてのリソースのセキュリティが侵害される可能性があります。

この例では、AccessKeyペアは、ID認証を実装するためにALIBABA_CLOUD_ACCESS_KEY_IDとALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数に保存されます。

  1. CreateKey操作を呼び出して、CMKを作成します。

    aliyun kms CreateKey

    期待される出力:

    {
      "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. (オプション) CMKのエイリアスを作成します。 この手順を実行することを推奨します。

    エイリアスは、CMKを識別するためにオプションで使用されます。 CMKにエイリアスがない場合は、CMKのIDを使用してCMKを識別できます。

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

    この例では、ApolloプロジェクトのCMKに対してエイリアスApollo/WorkKeyが作成されます。 このエイリアスは、後続のサンプルコードで使用されます。 暗号化操作を呼び出すときに、alias/Apollo/WorkKeyを使用してCMKを参照できます。

  3. 暗号化操作を呼び出して、SSL証明書の秘密鍵を暗号化します。 次に、KMSは秘密鍵を暗号化します。

    次のサンプルコード:

    • alias/Apollo/WorkKeyはCMKのエイリアスです。

    • . /certs/key.pemはプレーンテキストの秘密鍵です。

    • . /certs/key.pem.cipherは暗号文の秘密鍵です。

    #!/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'
    
    # Read private key file in text mode
    in_content = ReadTextFile(in_file)
    
    # Encrypt
    ciphertext = KmsEncrypt(clt, in_content, key_alias)
    
    # Write encrypted key file in text mode
    WriteTextFile(out_file, ciphertext)
  4. Decrypt操作を呼び出して、暗号文秘密鍵を復号化します。 次に、KMSは、ECSインスタンスにデプロイした秘密鍵を復号化します。

    次のサンプルコード:

    • . /certs/key.pem.cipherは暗号文の秘密鍵です。

    • . /certs/decrypted_key.pemはプレーンテキストの秘密鍵です。

    #!/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'
    
    # Read encrypted key file in text mode
    in_content = ReadTextFile(in_file)
    
    # Decrypt
    ciphertext = KmsDecrypt(clt, in_content)
    
    # Write Decrypted key file in text mode
    WriteTextFile(out_file, ciphertext)