全部產品
Search
文件中心

Key Management Service:專屬KMS Go SDK

更新時間:Jul 06, 2024

專屬KMS SDK for Go協助您通過簡單的編程訪問專屬KMS的API,實現加密解密、簽名驗簽和擷取憑據資訊的業務訴求。

背景資訊

您可以訪問開原始碼倉庫,查看SDK源碼及程式碼範例。同時也歡迎您提出寶貴意見,或者提供程式碼範例。

前提條件

  • 您已經啟用專屬KMS執行個體並正常串連密碼機,為執行個體建立密鑰及應用存取點,並儲存了Client Key及CA認證。具體操作,請參見快速入門
    說明 CA認證下載後檔案名稱預設為PrivateKmsCA_kst-******.pem,應用身份憑證檔案下載後檔案名稱預設為ClientKey_******.json。
  • 已經擷取專屬KMS執行個體VPC地址,並確保可以通過以下方式訪問專屬KMS執行個體VPC地址:
    • 在啟用密碼機執行個體叢集時設定的VPC中訪問專屬KMS執行個體VPC地址。
    • 本地裝置所在網路可以正常解析並訪問專屬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的預設配置項。

  1. 配置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)
  2. 建立專屬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)