专属KMS SDK for Go帮助您通过简单的编程访问专属KMS的API,实现加密解密、签名验签和获取凭据信息的业务诉求。
背景信息
您可以访问开源代码仓库,查看SDK源码及代码示例。同时也欢迎您提出宝贵意见,或者提供代码示例。
前提条件
- 您已经启用专属KMS基础版实例,为实例创建密钥及应用接入点,并保存了Client Key及CA证书。具体操作,请参见快速入门。说明 CA证书下载后文件名默认为PrivateKmsCA_kst-******.pem,应用身份凭证文件下载后文件名默认为ClientKey_******.json。
- 您已经获取了专属KMS基础版实例VPC地址,并确保可以通过以下方式访问专属KMS基础版实例VPC地址:
- 启用专属KMS基础版实例时设置了VPC ID,在该VPC中您可以访问专属KMS基础版实例VPC地址。
- 您专属KMS SDK程序所在环境的网络,可以正常解析并访问专属KMS基础版实例VPC地址。
具体操作,请参见查询专属KMS基础版实例。
安装SDK
- 方式一:使用
go mod
管理您的依赖。在
go mod
中添加以下内容安装依赖包。require ( github.com/aliyun/alibabacloud-dkms-gcs-go-sdk SDK版本 )
说明 关于最新的SDK版本,请参考开源代码仓库。 - 方式二:使用
go get
命令获取远程代码包。$ go get -u github.com/aliyun/alibabacloud-dkms-gcs-go-sdk
初始化SDK
您可以初始化一个专属KMS基础版实例的Go客户端,用于调用专属KMS基础版实例管理的密钥等资源。使用Go SDK发起专属KMS API请求,您需要初始化一个Client实例,并根据需要修改Config的默认配置项。
- 配置CA证书。
为保障生产环境通信安全,需要配置可信证书。具体配置如下:
将CA证书内容设定为RuntimeOptions
的verify字段,示例代码如下:import ( dedicatedkmsopenapiutil "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi-util" "github.com/alibabacloud-go/tea/tea" "io/ioutil" ) // 验证服务端证书 ca, err := ioutil.ReadFile("path/to/caCert.pem") if err != nil { panic(err) } runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{ Verify: tea.String(string(ca)), } ... encryptResponse, err := client.EncryptWithOptions(encryptRequest, runtimeOptions)
开发环境可使用
RuntimeOptions
的ignoreSSL字段临时忽略可信证书的验证。示例代码如下:import ( dedicatedkmsopenapiutil "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi-util" "github.com/alibabacloud-go/tea/tea" ) // 忽略服务端证书 runtimeOptions := &dedicatedkmsopenapiutil.RuntimeOptions{ IgnoreSSL: tea.Bool(true), } ... encryptResponse, err := client.EncryptWithOptions(encryptRequest, runtimeOptions)
- 创建专属KMS基础版Client。
创建专属KMS基础版Client时,需要指定基础版实例的Endpoint。EndPoint为专属KMS基础版实例服务地址去掉https://。关于专属KMS基础版实例服务地址的更多信息,请参见查询专属KMS基础版实例。
import ( dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi" dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk" "github.com/alibabacloud-go/tea/tea" ) config := &dedicatedkmsopenapi.Config{ // 连接协议,固定为HTTPS Protocol: tea.String("https"), // 专属KMS基础版实例Client Key ClientKeyContent: tea.String("<your client key content>"), // 专属KMS基础版实例Client Key解密口令 Password: tea.String("<your client key password>"), // Endpoint,专属KMS基础版实例的服务地址去掉'https://' Endpoint: tea.String("<service_id>.cryptoservice.kms.aliyuncs.com"), } client, err := dedicatedkmssdk.NewClient(config)
示例
- 专属KMS基础版Client调用Encrypt接口使用对称密钥加密数据
详细代码示例,请参见原始代码。
import ( dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi" dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk" "github.com/alibabacloud-go/tea/tea" ) // 待加密数据。 plaintext := []byte("encrypt plaintext") // 专属KMS基础版实例加密密钥的ID或别名(Alias)。 keyId := "<your cipher key id>" encryptRequest := &dedicatedkmssdk.EncryptRequest{ KeyId: tea.String(keyId), Plaintext: plaintext, } encryptResponse, err := client.EncryptWithOptions(encryptRequest, runtimeOptions) if err != nil { panic(err) } // 密文。 cipher := encryptResponse.CiphertextBlob // Cipher初始向量,用于解密数据。 iv := encryptResponse.Iv // 请求ID。 requestId := tea.StringValue(encryptResponse.RequestId)
- 专属KMS基础版Client调用Decrypt接口使用对称密钥解密密文
详细代码示例,请参见原始代码。
import ( dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi" dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk" "github.com/alibabacloud-go/tea/tea" ) // 专属KMS基础版实例解密密钥的ID或别名(Alias)。 keyId := "<your cipher key id>" // 待解密数据,加密返回的密文。 ciphertextBlob := []byte("<your cipher data to decrypt>") // Cipher初始向量,必须与加密时一致。 iv := []byte("<IV value>") decryptRequest := &dedicatedkmssdk.DecryptRequest{ KeyId: tea.String(keyId), CiphertextBlob: ciphertextBlob, Iv: iv, } decryptResponse, err := client.DecryptWithOptions(decryptRequest, runtimeOptions) if err != nil { panic(err) } // 原始明文数据。 plaintext := decryptResponse.Plaintext // 请求ID。 requestId := tea.StringValue(decryptResponse.RequestId)
- 专属KMS基础版Client调用Sign接口使用非对称密钥进行数字签名
详细代码示例,请参见原始代码。
import ( dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi" dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk" "github.com/alibabacloud-go/tea/tea" ) // 专属KMS实例签名密钥的ID或别名(Alias)。 signerKeyId := "<the signer key id>" // 待签名数据。 message := []byte("<the data to sign>") signRequest := &dedicatedkmssdk.SignRequest{ KeyId: tea.String(signerKeyId), Message: message, MessageType: tea.String(messageType), } signResponse, err := client.SignWithOptions(signRequest, runtimeOptions) if err != nil { panic(err) } // 签名值。 signature := signResponse.Signature // 请求ID。 requestId := tea.StringValue(signResponse.RequestId)
- 专属KMS基础版Client调用Verify接口使用非对称密钥验证数字签名
详细代码示例,请参见原始代码。
import ( dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi" dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk" "github.com/alibabacloud-go/tea/tea" ) // 专属KMS基础版实例签名密钥的ID或别名(Alias)。 signerKeyId := "<the signer key id>" // 待验证签名的数据。 message := []byte("<the data to sign>") // 待验证签名值。 signature := []byte("<the signature>") verifyRequest := &dedicatedkmssdk.VerifyRequest{ KeyId: tea.String(signerKeyId), Message: message, MessageType: tea.String(messageType), Signature: signature, } verifyResponse, err := client.VerifyWithOptions(verifyRequest, runtimeOptions) if err != nil { panic(err) } // 验签结果。 value := tea.BoolValue(verifyResponse.Value) // 请求ID。 requestId := tea.StringValue(verifyResponse.RequestId)
- 使用专属KMS基础版Client调用GetSecretValue接口获取凭据值
详细代码示例,请参见原始代码。
重要 0.2.1及以上版本的专属KMS Go SDK才支持获取凭据值。import ( dedicatedkmsopenapi "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/openapi" dedicatedkmssdk "github.com/aliyun/alibabacloud-dkms-gcs-go-sdk/sdk" "github.com/alibabacloud-go/tea/tea" ) // 凭据名称。 secretName := "<your-dkms-secret-name>" getSecretValueRequest := &dedicatedkmssdk.GetSecretValueRequest{ SecretName: tea.String(secretName), } // 调用获取凭据值接口。 response, err := client.GetSecretValueWithOptions(getSecretValueRequest, runtimeOptions) if err != nil { panic(err) } // 凭据值。 _secretData := tea.StringValue(response.SecretData) // 请求ID。 _RequestId := tea.StringValue(response.RequestId)