Alibaba Cloud にデプロイされた IT 資産の機密情報は暗号化する必要があります。 KMS (Key Management Service) の暗号化操作を呼び出して、6 KB 未満のデータをオンラインで暗号化または復号できます。

シナリオ

CMK 暗号化は、以下に示す例だけでなく、さまざまなシナリオで使用できます。
  • 設定ファイルの暗号化
  • SSL 証明書の秘密鍵の暗号化

このトピックでは、KMS API を呼び出して、SSL 証明書の秘密鍵をオンラインで暗号化および復号する方法について説明します。

CMK 暗号化の仕組み

ユーザーデータは、暗号化された回線で KMS サーバーに送信されます。 KMS サーバーはデータを暗号化または復号してから、暗号化された回線でユーザーにデータを返します。 下図にプロセスを示します。 手順 :
  1. KMS コンソールを使用するか、または、CreateKey API を呼び出して、CMK (カスタマーマスターキー) を作成します。 詳細については、CMK の作成をご参照ください。
  2. KMS の暗号化 API を呼び出して、SSL 証明書の秘密鍵を暗号化します。 秘密鍵の暗号文が返されます。 詳細については、 秘密鍵の暗号化をご参照ください。
  3. クラウドサーバーに SSL 証明書と暗号化秘密鍵をインストールします。
  4. クラウドサーバーは、暗号化された接続を作成する必要がある場合、KMS の復号 API を呼び出して、暗号文の秘密鍵を復号します。 詳細については、 秘密鍵の復号をご参照ください。

関連する API

データを暗号化および復号化するには、以下の API を呼び出します。
操作 説明
CreateKey CMK を作成します。
CreateAlias CMK にエイリアスを割り当てます。
Encrypt 指定された CMK でデータを暗号化します。
Decrypt KMS によって暗号化されたデータを復号します。 CMK を指定する必要はありません。

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

  1. CreateKey API を呼び出して 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": "111122223333",
        "Arn": "acs:kms:cn-hangzhou:111122223333:key/1234abcd-12ab-34cd-56ef-12345678****",
        "Origin": "Aliyun_KMS",
        "MaterialExpireTime": ""
      },
      "RequestId": "2a37b168-9fa0-4d71-aba4-2077dd9e80df"
    }
  2. オプション:CMK にエイリアスを割り当てます。
    エイリアスの割り当ては任意です。 CMK にエイリアスが割り当てられていない場合、CMK の ID を使用できます。
    $ aliyun kms CreateAlias --AliasName alias/Apollo/WorkKey --KeyId 1234abcd-12ab-34cd-56ef-12345678****
    この例の Apollo/WorkKey は、秘密鍵の暗号化に使用される Apollo プロジェクトの CMK を指定しています。 CMK のエイリアスは WorkKey です。 これは、 CMK WorkKeyを使用して秘密鍵を暗号化するために alias/Apollo/WorkKey が指定できることを意味します。
  3. Encrypt API を呼び出して、秘密鍵を暗号化します。 KMS が秘密鍵を暗号化します。
    サンプルコード
    • CMK:CMK のエイリアスは alias/Apollo/WorkKey です。
    • 平文の秘密鍵: ./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 DecryptRequest
    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(clt.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('<Access-Key-Id>','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 API を呼び出して、暗号文の秘密鍵を復号します。 KMS は、クラウドサーバーにインストールした秘密鍵を復号します。
    サンプルコード:
    • 暗号化された秘密鍵: ./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(clt.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('<Access-Key-Id>','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)