专属KMS SDK for Java帮助您通过简单的编程访问专属KMS的API,实现加密解密、签名验签和获取凭据信息的业务诉求。本文介绍如何初始化SDK以及如何调用接口进行加密解密、签名验签和获取凭据信息。
背景信息
前提条件
- 您已经启用专属KMS实例并正常连接密码机,为实例创建密钥及应用接入点,并保存了Client Key及CA证书。具体操作,请参见快速入门。
说明 CA证书下载后文件名默认为PrivateKmsCA_kst-******.pem,应用身份凭证文件下载后文件名默认为ClientKey_******.json。
- 已经获取专属KMS实例VPC地址,并确保可以通过以下方式访问专属KMS实例VPC地址:
- 在激活密码机实例集群时设置的VPC中访问专属KMS实例VPC地址。
- 本地设备所在网络可以正常解析并访问专属KMS实例VPC地址。
具体操作,请参见查询专属KMS标准版实例。
安装SDK
在项目中添加alibabacloud-dkms-gcs-sdk的依赖,可从Maven仓库中自动下载发布的Java安装包。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibabacloud-dkms-gcs-sdk</artifactId>
<version>x.x.x</version>
</dependency>
说明 专属KMS SDK的最新版本,请参见专属KMS SDK for Java。
初始化SDK
您可以初始化一个专属KMS实例的Java客户端,用于调用专属KMS实例提供的服务:使用密钥进行密码计算、获取凭据值等。使用Java SDK发起专属KMS API请求,您需要初始化一个Client实例。
适用于0.2.7及以上版本(推荐)
初始化Client实例。
import com.aliyun.dkms.gcs.openapi.models.Config;
import com.aliyun.dkms.gcs.sdk.Client;
// 专属KMS实例与客户端之间的连接协议,固定为https
String protocol = "https";
// Endpoint,专属KMS实例VPC地址去掉https://
String endpoint = "<service_id>.cryptoservice.kms.aliyuncs.com";
// DKMS Client Key
String clientKeyFilePath = "<your client key file path>";
//String clientKey = "<your client key>";
// DKMS Client Key 解密口令
String clientKeyPass = "<your client key password>";
String caCertPath = "<path/to/DKMSInstanceCACertificates>";
//String caCert = "<The DKMS instance CA certificates content>";
Client client = new Client(new Config()
.setProtocol(protocol)
.setEndpoint(endpoint)
.setCaFilePath(caCertPath) // 设置CA证书文件路径,还支持设置CA证书内容,请根据需要选择。
//.setCa(caCert) // 设置CA证书内容。
.setClientKeyFile(clientKeyFilePath)//设置应用身份凭证文件路径,还支持设置应用身份凭证内容,请根据需要选择。
//.setClientKeyContent(clientKey)//设置应用身份凭证内容。
.setPassword(clientKeyPass));
开发环境可使用
RuntimeOptions
设置临时忽略可信证书的验证。示例代码如下:import com.aliyun.dkms.gcs.openapi.util.models.RuntimeOptions;
RuntimeOptions runtimeOptions = new RuntimeOptions();
runtimeOptions.setIgnoreSSL(true);
...
client.encryptWithOptions(encryptRequest, runtimeOptions);
适用于0.2.6及以下版本
代码示例
- 专属KMS Client调用Encrypt接口使用对称密钥加密数据
详细代码示例,请参见原始代码。
import com.aliyun.dkms.gcs.sdk.Client; import com.aliyun.dkms.gcs.sdk.models.*; //专属KMS实例加密密钥的ID或别名(Alias)。 String cipherKeyId = "<your cipher key id>"; //待加密数据。 byte[] originData = <your origin data to encrypt>; EncryptRequest encryptRequest = new EncryptRequest(); encryptRequest.setKeyId(cipherKeyId); encryptRequest.setPlaintext(originData); EncryptResponse encryptResponse = client.encrypt(encryptRequest); //加密数据。 byte[] cipherData = encryptResponse.getCiphertextBlob(); //Cipher初始向量,用于解密数据。 byte[] iv = encryptResponse.getIv(); //请求ID。 String requestId = encryptResponse.getRequestId();
- 专属KMS Client调用Decrypt接口使用对称密钥解密密文
详细代码示例,请参见原始代码。
import com.aliyun.dkms.gcs.sdk.Client; import com.aliyun.dkms.gcs.sdk.models.*; //专属KMS实例解密密钥的ID或别名(Alias)。 String cipherKeyId = "<your cipher key id>"; //待解密数据。 byte[] cipherData = <your cipher data to decrypt>; //Cipher初始向量,必须与加密时一致。 byte[] iv = <IV value>; DecryptRequest decryptRequest = new DecryptRequest(); decryptRequest.setKeyId(cipherKeyId); decryptRequest.setCiphertextBlob(cipherData); decryptRequest.setIv(iv); DecryptResponse decryptResponse = client.decrypt(decryptRequest); //原始数据。 byte[] originData = decryptResponse.getPlaintext(); //请求ID。 String requestId = decryptResponse.getRequestId();
- 专属KMS Client调用Sign接口使用非对称密钥进行数字签名
详细代码示例,请参见原始代码。
import com.aliyun.dkms.gcs.sdk.Client; import com.aliyun.dkms.gcs.sdk.models.*; //专属KMS实例签名密钥的ID或别名(Alias)。 String signerKeyId = "<the signer key id>"; //待签名数据。 byte[] message = <the data to sign>; SignRequest signRequest = new SignRequest(); signRequest.setKeyId(signKeyId); signRequest.setMessage(message); SignResponse signResponse = client.sign(signRequest); //签名值。 byte[] signature = signResponse.getSignature(); //请求ID。 String requestId = signResponse.getRequestId();
- 专属KMS Client调用Verify接口使用非对称密钥验证数字签名
详细代码示例,请参见原始代码。
import com.aliyun.dkms.gcs.sdk.Client; import com.aliyun.dkms.gcs.sdk.models.*; //专属KMS实例签名密钥的ID或别名(Alias)。 String signerKeyId = "<the signer key id>"; //待验证签名的数据。 byte[] message = <the data to sign>; VerifyRequest verifyRequest = new VerifyRequest(); verifyRequest.setKeyId(signerKeyId); verifyRequest.setMessage(message); verifyRequest.setSignature(signature); VerifyResponse verifyResponse = client.verify(verifyRequest); //验签结果。 boolean valid = verifyResponse.getValue(); //请求ID。 String requestId = verifyResponse.getRequestId();
- 使用专属KMS Client调用GetSecretValue接口获取凭据值
详细代码示例,请参见原始代码。
说明 0.2.6及以上版本的专属KMS Java SDK才支持获取凭据值。import com.aliyun.dkms.gcs.sdk.Client; import com.aliyun.dkms.gcs.sdk.models.*; //专属KMS的凭据名称。 String secretName = "<your-secret-name>"; GetSecretValueRequest request = new GetSecretValueRequest() .setSecretName(secretName); GetSecretValueResponse getSecretValueResponse = client.getSecretValue(request); //凭据值 String secretData = getSecretValueResponse.getSecretData(); //请求ID String requestId = getSecretValueResponse.getRequestId();