@@ -41,7 +41,13 @@ type keyVaultClient struct {
41
41
}
42
42
43
43
// NewKeyVaultClient returns a new key vault client to use for kms operations
44
- func newKeyVaultClient (config * config.AzureConfig , vaultName , keyName , keyVersion string , proxyMode bool , proxyAddress string , proxyPort int ) (* keyVaultClient , error ) {
44
+ func newKeyVaultClient (
45
+ config * config.AzureConfig ,
46
+ vaultName , keyName , keyVersion string ,
47
+ proxyMode bool ,
48
+ proxyAddress string ,
49
+ proxyPort int ,
50
+ managedHSM bool ) (* keyVaultClient , error ) {
45
51
// Sanitize vaultName, keyName, keyVersion. (https://github.com/Azure/kubernetes-kms/issues/85)
46
52
vaultName = utils .SanitizeString (vaultName )
47
53
keyName = utils .SanitizeString (keyName )
@@ -65,13 +71,17 @@ func newKeyVaultClient(config *config.AzureConfig, vaultName, keyName, keyVersio
65
71
env .ActiveDirectoryEndpoint = fmt .Sprintf ("http://%s:%d/" , proxyAddress , proxyPort )
66
72
}
67
73
68
- token , err := auth .GetKeyvaultToken (config , env , proxyMode )
74
+ vaultResourceURL := getVaultResourceIdentifier (managedHSM , env )
75
+ if vaultResourceURL == azure .NotAvailable {
76
+ return nil , fmt .Errorf ("keyvault resource identifier not available for cloud: %s" , env .Name )
77
+ }
78
+ token , err := auth .GetKeyvaultToken (config , env , vaultResourceURL , proxyMode )
69
79
if err != nil {
70
80
return nil , fmt .Errorf ("failed to get key vault token, error: %+v" , err )
71
81
}
72
82
kvClient .Authorizer = token
73
83
74
- vaultURL , err := getVaultURL (vaultName , env )
84
+ vaultURL , err := getVaultURL (vaultName , managedHSM , env )
75
85
if err != nil {
76
86
return nil , fmt .Errorf ("failed to get vault url, error: %+v" , err )
77
87
}
@@ -128,7 +138,7 @@ func (kvc *keyVaultClient) Decrypt(ctx context.Context, plain []byte) ([]byte, e
128
138
return bytes , nil
129
139
}
130
140
131
- func getVaultURL (vaultName string , azureEnvironment * azure.Environment ) (vaultURL * string , err error ) {
141
+ func getVaultURL (vaultName string , managedHSM bool , env * azure.Environment ) (vaultURL * string , err error ) {
132
142
// Key Vault name must be a 3-24 character string
133
143
if len (vaultName ) < 3 || len (vaultName ) > 24 {
134
144
return nil , fmt .Errorf ("invalid vault name: %q, must be between 3 and 24 chars" , vaultName )
@@ -140,13 +150,30 @@ func getVaultURL(vaultName string, azureEnvironment *azure.Environment) (vaultUR
140
150
return nil , fmt .Errorf ("invalid vault name: %q, must match [-a-zA-Z0-9]{3,24}" , vaultName )
141
151
}
142
152
143
- vaultDNSSuffixValue := azureEnvironment .KeyVaultDNSSuffix
144
- vaultURI := "https://" + vaultName + "." + vaultDNSSuffixValue + "/"
153
+ vaultDNSSuffixValue := getVaultDNSSuffix (managedHSM , env )
154
+ if vaultDNSSuffixValue == azure .NotAvailable {
155
+ return nil , fmt .Errorf ("vault dns suffix not available for cloud: %s" , env .Name )
156
+ }
145
157
158
+ vaultURI := fmt .Sprintf ("https://%s.%s/" , vaultName , vaultDNSSuffixValue )
146
159
return & vaultURI , nil
147
160
}
148
161
149
162
func getProxiedVaultURL (vaultURL * string , proxyAddress string , proxyPort int ) * string {
150
163
proxiedVaultURL := fmt .Sprintf ("http://%s:%d/%s" , proxyAddress , proxyPort , strings .TrimPrefix (* vaultURL , "https://" ))
151
164
return & proxiedVaultURL
152
165
}
166
+
167
+ func getVaultDNSSuffix (managedHSM bool , env * azure.Environment ) string {
168
+ if managedHSM {
169
+ return env .ManagedHSMDNSSuffix
170
+ }
171
+ return env .KeyVaultDNSSuffix
172
+ }
173
+
174
+ func getVaultResourceIdentifier (managedHSM bool , env * azure.Environment ) string {
175
+ if managedHSM {
176
+ return env .ResourceIdentifiers .ManagedHSM
177
+ }
178
+ return env .ResourceIdentifiers .KeyVault
179
+ }
0 commit comments