|
|
@@ -47,6 +47,7 @@ const (
|
|
|
|
|
|
errVaultStore = "received invalid Vault SecretStore resource: %w"
|
|
|
errVaultClient = "cannot setup new vault client: %w"
|
|
|
+ errVaultTLSClient = "cannot setup new TLS vault client: %w"
|
|
|
errVaultCert = "cannot set Vault CA certificate: %w"
|
|
|
errReadSecret = "cannot read secret data from Vault: %w"
|
|
|
errAuthFormat = "cannot initialize Vault client: no valid auth method specified: %w"
|
|
|
@@ -111,7 +112,8 @@ func (c *connector) NewClient(ctx context.Context, store esv1alpha1.GenericStore
|
|
|
storeKind: store.GetObjectKind().GroupVersionKind().Kind,
|
|
|
}
|
|
|
|
|
|
- cfg, err := vStore.newConfig()
|
|
|
+ cfg, err := vStore.newConfig(ctx)
|
|
|
+
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
@@ -125,7 +127,7 @@ func (c *connector) NewClient(ctx context.Context, store esv1alpha1.GenericStore
|
|
|
client.SetNamespace(*vaultSpec.Namespace)
|
|
|
}
|
|
|
|
|
|
- if err := vStore.setAuth(ctx, client); err != nil {
|
|
|
+ if err := vStore.setAuth(ctx, client, cfg); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
@@ -209,7 +211,7 @@ func (v *client) readSecret(ctx context.Context, path, version string) (map[stri
|
|
|
return byteMap, nil
|
|
|
}
|
|
|
|
|
|
-func (v *client) newConfig() (*vault.Config, error) {
|
|
|
+func (v *client) newConfig(ctx context.Context) (*vault.Config, error) {
|
|
|
cfg := vault.DefaultConfig()
|
|
|
cfg.Address = v.store.Server
|
|
|
|
|
|
@@ -230,7 +232,7 @@ func (v *client) newConfig() (*vault.Config, error) {
|
|
|
return cfg, nil
|
|
|
}
|
|
|
|
|
|
-func (v *client) setAuth(ctx context.Context, client Client) error {
|
|
|
+func (v *client) setAuth(ctx context.Context, client Client, cfg *vault.Config) error {
|
|
|
tokenRef := v.store.Auth.TokenSecretRef
|
|
|
if tokenRef != nil {
|
|
|
token, err := v.secretKeyRef(ctx, tokenRef)
|
|
|
@@ -281,6 +283,16 @@ func (v *client) setAuth(ctx context.Context, client Client) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+ certAuth := v.store.Auth.Cert
|
|
|
+ if certAuth != nil {
|
|
|
+ token, err := v.requestTokenWithCertAuth(ctx, client, certAuth, cfg)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ client.SetToken(token)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
return errors.New(errAuthFormat)
|
|
|
}
|
|
|
|
|
|
@@ -503,7 +515,7 @@ func (v *client) requestTokenWithJwtAuth(ctx context.Context, client Client, jwt
|
|
|
"role": role,
|
|
|
"jwt": jwt,
|
|
|
}
|
|
|
- url := strings.Join([]string{"/v1", "auth", "jwt", "login"}, "/")
|
|
|
+ url := strings.Join([]string{"/v1", "auth", "cert", "login"}, "/")
|
|
|
request := client.NewRequest("POST", url)
|
|
|
|
|
|
err = request.SetJSONBody(parameters)
|
|
|
@@ -530,3 +542,41 @@ func (v *client) requestTokenWithJwtAuth(ctx context.Context, client Client, jwt
|
|
|
|
|
|
return token, nil
|
|
|
}
|
|
|
+
|
|
|
+func (v *client) requestTokenWithCertAuth(ctx context.Context, client Client, certAuth *esv1alpha1.VaultCertAuth, cfg *vault.Config) (string, error) {
|
|
|
+
|
|
|
+ tlscfg := vault.TLSConfig{
|
|
|
+ ClientCert: "/home/ric/Desktop/temp/certificates/client/client.crt",
|
|
|
+ ClientKey: "/home/ric/Desktop/temp/certificates/client/client.key",
|
|
|
+ CACert: "/home/ric/Desktop/temp/certificates/vault.ca",
|
|
|
+ }
|
|
|
+
|
|
|
+ err := cfg.ConfigureTLS(&tlscfg)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return "", fmt.Errorf(errVaultCert, err)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ url := strings.Join([]string{"/v1", "auth", "cert", "login"}, "/")
|
|
|
+ request := client.NewRequest("POST", url)
|
|
|
+
|
|
|
+ resp, err := client.RawRequestWithContext(ctx, request)
|
|
|
+ if err != nil {
|
|
|
+ return "", fmt.Errorf(errVaultRequest, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ defer resp.Body.Close()
|
|
|
+
|
|
|
+ vaultResult := vault.Secret{}
|
|
|
+ if err = resp.DecodeJSON(&vaultResult); err != nil {
|
|
|
+ return "", fmt.Errorf(errVaultResponse, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ token, err := vaultResult.TokenID()
|
|
|
+ if err != nil {
|
|
|
+ return "", fmt.Errorf(errVaultToken, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ return token, nil
|
|
|
+}
|