Alibaba Cloud にデプロイされた IT 資産の機密情報は暗号化する必要があります。 KMS (Key Management Service) の暗号化操作を呼び出して、6 KB 未満のデータをオンラインで暗号化または復号できます。
シナリオ
CMK 暗号化は、以下に示す例だけでなく、さまざまなシナリオで使用できます。
- 設定ファイルの暗号化
- SSL 証明書の秘密鍵の暗号化
このトピックでは、KMS API を呼び出して、SSL 証明書の秘密鍵をオンラインで暗号化および復号する方法について説明します。
CMK 暗号化の仕組み
ユーザーデータは、暗号化された回線で KMS サーバーに送信されます。 KMS サーバーはデータを暗号化または復号してから、暗号化された回線でユーザーにデータを返します。
下図にプロセスを示します。 手順 :
関連する API
データを暗号化および復号化するには、以下の API を呼び出します。
操作 | 説明 |
---|---|
CreateKey | CMK を作成します。 |
CreateAlias | CMK にエイリアスを割り当てます。 |
Encrypt | 指定された CMK でデータを暗号化します。 |
Decrypt | KMS によって暗号化されたデータを復号します。 CMK を指定する必要はありません。 |
SSL 証明書の秘密鍵を暗号化および復号する
- 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" }
- オプション: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
が指定できることを意味します。 - 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)
- CMK:CMK のエイリアスは
- 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)