Alibaba CloudにデプロイされているITアセットの機密データを暗号化する必要があります。 Key Management Service (KMS) の暗号化API操作を呼び出して、6 KB未満のデータを暗号化または復号化できます。 このトピックでは、KMSのAPI操作を呼び出してSSL証明書の秘密鍵を暗号化および復号化する方法について説明します。
背景情報
次のシナリオでは、顧客マスターキー (CMK) を使用してデータを暗号化および復号できますが、これに限定されません。
設定ファイルの暗号化
SSL証明書の秘密鍵を暗号化します。
アーキテクチャ
ユーザーのデータは、安全なチャネルを介してKMSサーバーに送信されます。 KMSサーバーはデータを暗号化または復号化し、その結果を安全なチャネルを介してユーザーに返します。 下図にプロセスを示します。
のプロシージャ:
KMSコンソールで、またはCreateKey操作を呼び出してCMKを作成します。
KMSのEncrypt操作を呼び出して、SSL証明書の秘密鍵を暗号化します。 暗号文の秘密鍵が返されます。
暗号文秘密鍵を使用して、ECS (Elastic Compute Service) インスタンスにSSL証明書をデプロイします。
ECSインスタンスが起動し、SSL証明書を使用する必要があるときに、KMSのDecrypt操作を呼び出して暗号文を復号します。
関連する API 操作
データを暗号化および復号化するには、以下の API を呼び出します。
API 操作 | 説明 |
CMK を作成します。 | |
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環境変数に保存されます。
認証情報の設定方法の詳細については、「アクセス資格情報の管理」をご参照ください。
環境変数を設定するために使用される方法は、オペレーティングシステムによって異なります。 詳細については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。
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" }(オプション) 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を参照できます。暗号化操作を呼び出して、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)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)