Go Client Library for Google Cloud Key Management Service (KMS) API for managing cryptographic keys and performing cryptographic operations
The EkmClient manages connections to external key managers and enables using externally-managed cryptographic keys with Cloud KMS. This allows you to use keys stored in external key management systems while leveraging Cloud KMS's API and integration capabilities.
Package: cloud.google.com/go/kms/apiv1
Thread Safety: Methods (except Close) may be called concurrently. Fields must not be modified concurrently with method calls.
func NewEkmClient(ctx context.Context, opts ...option.ClientOption) (*EkmClient, error)Creates a new ekm service client based on gRPC. The returned client must be Closed when done.
func NewEkmRESTClient(ctx context.Context, opts ...option.ClientOption) (*EkmClient, error)Creates a new ekm service REST client.
Example:
import kms "cloud.google.com/go/kms/apiv1"
ctx := context.Background()
client, err := kms.NewEkmClient(ctx)
if err != nil {
// Handle error
}
defer client.Close()type EkmClient struct {
// CallOptions contains the retry settings for each method
CallOptions *EkmCallOptions
// Has unexported fields
}func (c *EkmClient) CreateEkmConnection(ctx context.Context, req *kmspb.CreateEkmConnectionRequest, opts ...gax.CallOption) (*kmspb.EkmConnection, error)Creates a new EkmConnection in a given Project and Location.
Request:
type CreateEkmConnectionRequest struct {
Parent string // Required: "projects/{project}/locations/{location}"
EkmConnectionId string // Required: EkmConnection ID
EkmConnection *EkmConnection // Required: Initial field values
}Example:
req := &kmspb.CreateEkmConnectionRequest{
Parent: "projects/my-project/locations/us-central1",
EkmConnectionId: "my-ekm-connection",
EkmConnection: &kmspb.EkmConnection{
ServiceResolvers: []*kmspb.EkmConnection_ServiceResolver{
{
ServiceDirectoryService: "projects/my-project/locations/us-central1/namespaces/my-namespace/services/my-service",
Hostname: "ekm.example.com",
ServerCertificates: []*kmspb.Certificate{
{RawDer: certBytes},
},
},
},
},
}
ekmConn, err := client.CreateEkmConnection(ctx, req)func (c *EkmClient) GetEkmConnection(ctx context.Context, req *kmspb.GetEkmConnectionRequest, opts ...gax.CallOption) (*kmspb.EkmConnection, error)Returns metadata for a given EkmConnection.
Request:
type GetEkmConnectionRequest struct {
Name string // Required: "projects/{project}/locations/{location}/ekmConnections/{ekmConnection}"
}func (c *EkmClient) UpdateEkmConnection(ctx context.Context, req *kmspb.UpdateEkmConnectionRequest, opts ...gax.CallOption) (*kmspb.EkmConnection, error)Updates an EkmConnection's metadata.
Request:
type UpdateEkmConnectionRequest struct {
EkmConnection *EkmConnection // Required: Updated values
UpdateMask *fieldmaskpb.FieldMask // Required: Fields to update
}func (c *EkmClient) ListEkmConnections(ctx context.Context, req *kmspb.ListEkmConnectionsRequest, opts ...gax.CallOption) *EkmConnectionIteratorLists EkmConnections in a location.
Request:
type ListEkmConnectionsRequest struct {
Parent string // Required: "projects/{project}/locations/{location}"
PageSize int32 // Optional: Max items per page
PageToken string // Optional: Pagination token
Filter string // Optional: Filter expression
OrderBy string // Optional: Ordering specification
}func (c *EkmClient) GetEkmConfig(ctx context.Context, req *kmspb.GetEkmConfigRequest, opts ...gax.CallOption) (*kmspb.EkmConfig, error)Returns the EkmConfig singleton resource for a given project and location.
Request:
type GetEkmConfigRequest struct {
Name string // Required: "projects/{project}/locations/{location}/ekmConfig"
}func (c *EkmClient) UpdateEkmConfig(ctx context.Context, req *kmspb.UpdateEkmConfigRequest, opts ...gax.CallOption) (*kmspb.EkmConfig, error)Updates the EkmConfig singleton resource for a given project and location.
Request:
type UpdateEkmConfigRequest struct {
EkmConfig *EkmConfig // Required: Updated values
UpdateMask *fieldmaskpb.FieldMask // Required: Fields to update
}Example:
import "google.golang.org/protobuf/types/known/fieldmaskpb"
req := &kmspb.UpdateEkmConfigRequest{
EkmConfig: &kmspb.EkmConfig{
Name: "projects/my-project/locations/us-central1/ekmConfig",
DefaultEkmConnection: "projects/my-project/locations/us-central1/ekmConnections/my-ekm-connection",
},
UpdateMask: &fieldmaskpb.FieldMask{
Paths: []string{"default_ekm_connection"},
},
}
config, err := client.UpdateEkmConfig(ctx, req)func (c *EkmClient) VerifyConnectivity(ctx context.Context, req *kmspb.VerifyConnectivityRequest, opts ...gax.CallOption) (*kmspb.VerifyConnectivityResponse, error)Verifies that Cloud KMS can successfully connect to the external key manager specified by an EkmConnection. If the request is successful, the response is empty.
Request:
type VerifyConnectivityRequest struct {
Name string // Required: EkmConnection resource name
}Example:
req := &kmspb.VerifyConnectivityRequest{
Name: "projects/my-project/locations/us-central1/ekmConnections/my-ekm-connection",
}
_, err := client.VerifyConnectivity(ctx, req)
if err != nil {
log.Printf("EKM connection verification failed: %v", err)
} else {
log.Println("EKM connection verified successfully")
}func (c *EkmClient) GetIamPolicy(ctx context.Context, req *iampb.GetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error)
func (c *EkmClient) SetIamPolicy(ctx context.Context, req *iampb.SetIamPolicyRequest, opts ...gax.CallOption) (*iampb.Policy, error)
func (c *EkmClient) TestIamPermissions(ctx context.Context, req *iampb.TestIamPermissionsRequest, opts ...gax.CallOption) (*iampb.TestIamPermissionsResponse, error)
func (c *EkmClient) GetLocation(ctx context.Context, req *locationpb.GetLocationRequest, opts ...gax.CallOption) (*locationpb.Location, error)
func (c *EkmClient) ListLocations(ctx context.Context, req *locationpb.ListLocationsRequest, opts ...gax.CallOption) *LocationIterator
func (c *EkmClient) GetOperation(ctx context.Context, req *longrunningpb.GetOperationRequest, opts ...gax.CallOption) (*longrunningpb.Operation, error)
func (c *EkmClient) Close() error
func (c *EkmClient) Connection() *grpc.ClientConn // Deprecatedtype EkmCallOptions struct {
ListEkmConnections []gax.CallOption
GetEkmConnection []gax.CallOption
CreateEkmConnection []gax.CallOption
UpdateEkmConnection []gax.CallOption
GetEkmConfig []gax.CallOption
UpdateEkmConfig []gax.CallOption
VerifyConnectivity []gax.CallOption
GetLocation []gax.CallOption
ListLocations []gax.CallOption
GetIamPolicy []gax.CallOption
SetIamPolicy []gax.CallOption
TestIamPermissions []gax.CallOption
GetOperation []gax.CallOption
}type EkmConnection struct {
Name string // Output only: Resource name
CreateTime *timestamppb.Timestamp // Output only: Creation time
ServiceResolvers []*EkmConnection_ServiceResolver // List of ServiceResolvers
Etag string // Optional: For concurrent updates
KeyManagementMode EkmConnection_KeyManagementMode // Optional: MANUAL or CLOUD_KMS
CryptoSpacePath string // Optional: Crypto space path (EKM replicas)
}An EkmConnection represents an individual EKM connection. Can be used for creating CryptoKeys and CryptoKeyVersions with ProtectionLevel EXTERNAL_VPC.
type EkmConnection_ServiceResolver struct {
ServiceDirectoryService string // Service Directory service name
EndpointFilter string // Optional: Filter for endpoints
Hostname string // Required: Hostname of the EKM replica
ServerCertificates []*Certificate // Required: X.509 certificates
}type EkmConnection_KeyManagementMode int32
const (
EkmConnection_KEY_MANAGEMENT_MODE_UNSPECIFIED EkmConnection_KeyManagementMode = 0 // Not specified
EkmConnection_MANUAL EkmConnection_KeyManagementMode = 1 // Keys manually managed
EkmConnection_CLOUD_KMS EkmConnection_KeyManagementMode = 2 // Keys managed by Cloud KMS
)type EkmConfig struct {
Name string // Output only: "projects/{project}/locations/{location}/ekmConfig"
DefaultEkmConnection string // Optional: Default EkmConnection resource name
}An EkmConfig is a singleton resource representing configuration for the External Key Manager in a given project and location.
type Certificate struct {
RawDer []byte // Required: Raw certificate bytes in DER format
Parsed bool // Output only: True if parsed successfully
Issuer string // Output only: Issuer name
Subject string // Output only: Subject name
SubjectAlternativeDnsNames []string // Output only: Subject Alternative DNS names
NotBeforeTime *timestamppb.Timestamp // Output only: Not Before time
NotAfterTime *timestamppb.Timestamp // Output only: Not After time
SerialNumber string // Output only: Serial number
Sha256Fingerprint string // Output only: SHA-256 fingerprint
}A Certificate represents an X.509 certificate used to authenticate HTTPS connections to EKM replicas.
package main
import (
"context"
"fmt"
"log"
"os"
kms "cloud.google.com/go/kms/apiv1"
"cloud.google.com/go/kms/apiv1/kmspb"
"google.golang.org/protobuf/types/known/fieldmaskpb"
)
func setupEKM() {
ctx := context.Background()
// Create EKM client
client, err := kms.NewEkmClient(ctx)
if err != nil {
log.Fatal(err)
}
defer client.Close()
// Load certificate
certBytes, err := os.ReadFile("ekm-cert.der")
if err != nil {
log.Fatal(err)
}
// Create EKM connection
ekmConn, err := client.CreateEkmConnection(ctx, &kmspb.CreateEkmConnectionRequest{
Parent: "projects/my-project/locations/us-central1",
EkmConnectionId: "my-ekm-connection",
EkmConnection: &kmspb.EkmConnection{
ServiceResolvers: []*kmspb.EkmConnection_ServiceResolver{
{
ServiceDirectoryService: "projects/my-project/locations/us-central1/namespaces/my-ns/services/my-svc",
Hostname: "ekm.example.com",
ServerCertificates: []*kmspb.Certificate{
{RawDer: certBytes},
},
},
},
KeyManagementMode: kmspb.EkmConnection_MANUAL,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Created EkmConnection: %s\n", ekmConn.Name)
// Verify connectivity
_, err = client.VerifyConnectivity(ctx, &kmspb.VerifyConnectivityRequest{
Name: ekmConn.Name,
})
if err != nil {
log.Fatalf("Connectivity verification failed: %v", err)
}
fmt.Println("EKM connection verified")
// Set as default EKM connection
_, err = client.UpdateEkmConfig(ctx, &kmspb.UpdateEkmConfigRequest{
EkmConfig: &kmspb.EkmConfig{
Name: "projects/my-project/locations/us-central1/ekmConfig",
DefaultEkmConnection: ekmConn.Name,
},
UpdateMask: &fieldmaskpb.FieldMask{
Paths: []string{"default_ekm_connection"},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println("Set as default EKM connection")
// Now create CryptoKeys with EXTERNAL_VPC protection level
keyClient, err := kms.NewKeyManagementClient(ctx)
if err != nil {
log.Fatal(err)
}
defer keyClient.Close()
cryptoKey, err := keyClient.CreateCryptoKey(ctx, &kmspb.CreateCryptoKeyRequest{
Parent: "projects/my-project/locations/us-central1/keyRings/my-keyring",
CryptoKeyId: "my-ekm-key",
CryptoKey: &kmspb.CryptoKey{
Purpose: kmspb.CryptoKey_ENCRYPT_DECRYPT,
VersionTemplate: &kmspb.CryptoKeyVersionTemplate{
Algorithm: kmspb.CryptoKeyVersion_EXTERNAL_SYMMETRIC_ENCRYPTION,
ProtectionLevel: kmspb.ProtectionLevel_EXTERNAL_VPC,
},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Created CryptoKey with EKM: %s\n", cryptoKey.Name)
}Install with Tessl CLI
npx tessl i tessl/golang-cloud-google-com--go--kms