KMS实例SDK for Python帮助您通过简单的编程访问KMS实例API,实现加密解密、签名验签和获取凭据值的业务诉求。本文介绍如何安装SDK以及如何调用接口进行加密解密、签名验签和获取凭据值。
背景信息
KMS提供了多种类型的开发工具(SDK),请您在使用前先了解各SDK的使用场景。更多信息,请参见SDK使用指引。
如果您使用Python3,可以访问Python3开源代码仓库,如果您使用Python2,可以访问Python2开源代码仓库,同时也欢迎您提出宝贵意见,或者提供代码示例。
前提条件
已购买和启用KMS实例。具体操作,请参见购买和启用KMS实例。
已完成密钥和凭据的创建。具体操作,请参见软件密钥、硬件密钥、创建凭据。
说明如果您的业务不涉及凭据,则无需创建凭据。
已创建应用接入点并保存了Client Key、获取KMS实例CA证书。具体操作,请参见通过应用接入点访问KMS实例。
请确保应用程序运行环境可访问KMS实例VPC地址。
业务场景
说明
应用程序运行环境和KMS实例在同一个地域,且属于同一个VPC
默认应用程序运行环境和KMS实例间网络互通,您无需配置。
应用程序运行环境和KMS实例在同一个地域,但属于不同VPC
您需要配置多个VPC访问同一个KMS实例,具体操作,请参见同地域多VPC访问KMS实例。
安装SDK
如果您使用Python3,请通过如下命令安装alibabacloud-dkms-gcs模块。
pip install alibabacloud-dkms-gcs
如果您使用Python2,请通过如下命令安装alibabacloud-dkms-gcs-python2模块。
pip install alibabacloud-dkms-gcs-python2
初始化SDK
使用Python SDK发起KMS实例API请求,您需要初始化一个Client实例。
初始化Client实例。
# -*- coding: utf-8 -*- from openapi.models import Config from sdk.client import Client config = Config() # 连接协议请设置为"https"。KMS实例服务仅允许通过HTTPS协议访问。 config.protocol = "https" # 设置endpoint为<your KMS Instance Id>.cryptoservice.kms.aliyuncs.com。 config.endpoint = "<your KMS Instance Id>.cryptoservice.kms.aliyuncs.com" # Client Key。 config.client_key_content = "<your-client-key-content>" # Client Key解密口令。 config.password = "<your-password>" client = Client(config)
通过配置运行时参数(
RuntimeOptions
)设置KMS实例的CA证书。重要为保障生产环境通信安全,建议您保持开启验证SSL/TLS证书有效性。如您确有需要关闭验证SSL/TLS证书,例如线下测试场景,可通过将运行时参数(
RuntimeOptions
)的ignore_ssl
字段设置为True实现。设置
RuntimeOptions
的verify
字段为KMS实例CA证书路径。代码示例如下:# -*- coding: utf-8 -*- from openapi_util.models import RuntimeOptions runtime_options = RuntimeOptions() # ca证书路径 runtime_options.verify = "<your-ca-certificate-file-path>"
使用已初始化的Client调用KMS实例API
初始化Client后,您可以通过Client调用KMS实例API,本文介绍如下几个使用场景和代码示例。关于KMS实例API的详细信息,请参见API概览。
调用Encrypt接口使用对称密钥加密数据
详细代码示例,请参见Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import EncryptRequest request = EncryptRequest() # 待加密数据。 request.plaintext = "<your-plaintext>".encode("utf-8") # 密钥的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
调用Decrypt接口使用对称密钥解密密文
详细代码示例,请参见Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import DecryptRequest request = DecryptRequest() # 待解密数据。 request.ciphertext_blob = "<your-ciphertext-blob>" # 密钥的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;
调用Sign接口使用非对称密钥进行数字签名
详细代码示例,请参见 Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import SignRequest request = SignRequest() # 密钥的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
调用Verify接口使用非对称密钥验证数字签名
详细代码示例,请参见Python3原始代码或Python2原始代码。
# -*- coding: utf-8 -*- from sdk.models import SignRequest request = VerifyRequest() # 密钥的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
调用GetSecretValue接口获取凭据值
详细代码示例,请参见Python3原始代码或Python2原始代码。
重要0.0.3及以上版本的KMS实例SDK for Python才支持获取凭据值。
0.0.5及以上版本的KMS实例SDK for Python2才支持获取凭据值。
# -*- 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