internal/kms/kms.go (80 lines of code) (raw):
package kms
import (
"context"
"errors"
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
kmssdk "github.com/alibabacloud-go/kms-20160120/v3/client"
"github.com/alibabacloud-go/tea/tea"
"github.com/aliyun/alibabacloud-kms-agent/internal/conf"
"github.com/aliyun/credentials-go/credentials"
"os"
"strings"
)
const (
InstanceGatewayDomainSuffix = "cryptoservice.kms.aliyuncs.com"
)
type KeyManagementService struct {
smClient SMInterface
config *openapi.Config
}
func NewKeyManagementService(cfg conf.KmsConfig) (*KeyManagementService, error) {
// default credentials: https://help.aliyun.com/zh/sdk/developer-reference/v2-manage-go-access-credentials?spm=a2c4g.11186623.help-menu-262060.d_1_9_1_2.33a45c4fAoE9MW&scm=20140722.H_2579531._.OR_help-T_cn~zh-V_1#3ca299f04bw3c
credentialClient, err := credentials.NewCredential(nil)
if err != nil {
return nil, err
}
config := &openapi.Config{
Credential: credentialClient,
RegionId: tea.String(*cfg.Region),
ReadTimeout: tea.Int(3 * 1000),
ConnectTimeout: tea.Int(3 * 1000),
Protocol: tea.String("https"),
}
if *cfg.Endpoint != "" {
config.Endpoint = tea.String(*cfg.Endpoint)
}
if *cfg.Endpoint != "" && strings.HasSuffix(*cfg.Endpoint, InstanceGatewayDomainSuffix) {
if *cfg.CaFilePath != "" {
data, err := os.ReadFile(*cfg.CaFilePath)
if err != nil {
return nil, fmt.Errorf("open ca file faaild:%w", err)
}
config.Ca = tea.String(string(data))
} else {
if ca, ok := RegionIdAndCaMap[*cfg.Region]; !ok {
return nil, errors.New("instance gateway private CA not found")
} else {
config.Ca = tea.String(ca)
}
}
}
smClient, err := newSecretManagerClient(config)
if err != nil {
return nil, err
}
return &KeyManagementService{smClient: smClient, config: config}, nil
}
func (kms *KeyManagementService) GetSecretInfo(ctx context.Context, secretId, versionId, versionStage string) (string, error) {
getSecretRequest := &kmssdk.GetSecretValueRequest{
FetchExtendedConfig: tea.Bool(true),
SecretName: tea.String(secretId),
VersionStage: tea.String(versionStage),
VersionId: tea.String(versionId),
}
ret, err := kms.smClient.GetSecretValue(ctx, getSecretRequest)
if err != nil {
return "", err
}
return ret.String(), nil
}
func (kms *KeyManagementService) SelfCheck() error {
err := kms.smClient.SelfCheck()
if err != nil {
return fmt.Errorf("secret manager client self check falied: %w", err)
}
return nil
}
func (kms *KeyManagementService) GetCredentialType() string {
cred, _ := kms.config.Credential.GetCredential()
return *cred.Type
}