专属KMS SDK for Python帮助您通过简单的编程访问专属KMS的API,实现加密解密、签名验签和获取凭据信息的业务诉求。
背景信息
- 如果您使用Python3访问专属KMS SDK,可以查看Python3开源代码仓库。
- 如果您使用Python2访问专属KMS SDK,可以查看Python2开源代码仓库。
前提条件
- 您已经启用专属KMS实例并正常连接密码机,为实例创建密钥及应用接入点,并保存了Client Key及CA证书。具体操作,请参见快速入门。
说明 CA证书下载后文件名默认为PrivateKmsCA_kst-******.pem,应用身份凭证文件下载后文件名默认为ClientKey_******.json。
- 已经获取专属KMS实例VPC地址,并确保可以通过以下方式访问专属KMS实例VPC地址:
- 在激活密码机实例集群时设置的VPC中访问专属KMS实例VPC地址。
- 本地设备所在网络可以正常解析并访问专属KMS实例VPC地址。
具体操作,请参见查询专属KMS标准版实例。
安装SDK
- 如果您通过Python3使用专属KMS SDK安装alibabacloud-dkms-gcs模块,安装命令如下:
pip install alibabacloud-dkms-gcs
- 如果您通过Python2使用专属KMS SDK安装alibabacloud-dkms-gcs-python2模块,安装命令如下:
pip install alibabacloud-dkms-gcs-python2
初始化SDK
您可以初始化一个专属KMS标准版实例的Python客户端,用于调用专属KMS标准版实例管理的密钥等资源。使用Python SDK发起专属KMS API请求,您需要初始化一个Client实例,并根据需要修改Config的默认配置项。
- 配置CA证书。
为保障生产环境通信安全,需要配置可信证书。
将CA证书路径设定为RuntimeOptions
的verify字段,示例代码如下:# -*- coding: utf-8 -*- from openapi_util.models import RuntimeOptions runtime_options = RuntimeOptions() # 忽略SSL验证 # runtime_options.ignore_ssl = True # ca证书路径 runtime_options.verify = "<your-ca-certificate-file-path>" ... response = client.encrypt_with_options(request, runtime_options)
- 创建专属KMS标准版Client。
创建专属KMS标准版Client时,需要指定实例的Endpoint。Endpoint为专属KMS标准版实例服务地址去掉https://。关于专属KMS标准版实例服务地址的更多信息,请参见查询专属KMS标准版实例。
# -*- coding: utf-8 -*- from openapi.models import Config from sdk.client import Client config = Config() # 连接协议,固定为HTTPS config.protocol = "https" # 专属KMS标准版实例Client Key config.client_key_content = "<your-client-key-content>" # 专属KMS标准版实例Client Key解密口令 config.password = "<your-password>" # Endpoint,专属KMS标准版实例服务地址去掉https:// config.endpoint = "<your-endpoint>" client = Client(config)
代码示例
- 专属KMS标准版Client调用Encrypt接口使用对称密钥加密数据
详细代码示例,请参见Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import EncryptRequest request = EncryptRequest() # 待加密数据 request.plaintext = "<your-plaintext>".encode("utf-8") # 专属KMS标准版实例加密密钥的ID或别名(Alias) request.key_id = "<your-key-id>" encrypt_response = client.encrypt_with_options(request, runtime_options) # 加密数据 ciphertext_blob = encrypt_response.ciphertext_blob # cipher初始向量,用于解密数据 iv = encrypt_response.iv # 请求ID request_id = encrypt_response.request_id
- 专属KMS标准版Client调用Decrypt接口使用对称密钥解密密文
详细代码示例,请参见Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import DecryptRequest request = DecryptRequest() # 待解密数据 request.ciphertext_blob = "<your-ciphertext-blob>" # 专属KMS标准版实例解密密钥的ID或别名(Alias) request.key_id = "<your-key-id>" # Cipher初始向量,必须与加密时一致 request.iv = "<your-iv>" decrypt_response = client.decrypt_with_options(request, runtime_options) # 原始明文数据 plaintext = decrypt_response.plaintext; # 请求ID request_id = decrypt_response.request_id;
- 专属KMS标准版Client调用Sign接口使用非对称密钥进行数字签名
详细代码示例,请参见 Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import SignRequest request = SignRequest() # 专属KMS标准版实例签名密钥的ID或别名(Alias) request.key_id = "<your-key-id>" # 待签名数据 request.message = "<your-raw-message>" # 签名算法 request.algorithm = "<your-algorithm>" sign_response = client.sign_with_options(request, runtime_options) # 签名值 signature = sign_response.signature # 请求ID request_id = sign_response.request_id
- 专属KMS标准版Client调用Verify接口使用非对称密钥验证数字签名
详细代码示例,请参见Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import SignRequest request = VerifyRequest() # 专属KMS标准版实例签名密钥的ID或别名(Alias)。 request.key_id = "<your-key-id>" # 待验证签名的数据 request.message = "<your-raw-message>" # 签名算法 request.algorithm = "<your-algorithm>" # 签名值 request.signature = "<your-signature>" verify_response = client.verify_with_options(request, runtime_options) # 验签结果 valid = verify_response.valid # 请求ID request_id = verify_response.request_id
- 使用专属KMS标准版Client调用GetSecretValue接口获取凭据值
详细代码示例,请参见Python3原始代码或Python2原始代码。
重要- 0.0.3及以上版本的专属KMS Python SDK才支持获取凭据值。
- 0.0.5及以上版本的专属KMS Python2 SDK才支持获取凭据值。
# -*- coding: utf-8 -*- from sdk.models import GetSecretValueRequest request = GetSecretValueRequest() # 凭据名称。 request.secret_name = "<your-secret-name>" response = client.get_secret_value_with_options(request, runtime_options) # 凭据值。 secret_data = response.secret_data # 请求ID。 request_id = response.request_id