Skip to content

Commit eafff3a

Browse files
committed
feat: completed certificate auth tests
Signed-off-by: Kai Fink <kai.fink@yahoo.de>
1 parent e0822da commit eafff3a

File tree

5 files changed

+69
-24
lines changed

5 files changed

+69
-24
lines changed

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ require (
114114
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
115115
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
116116
github.com/fatih/color v1.16.0 // indirect
117+
github.com/fatih/structs v1.1.0 // indirect
117118
github.com/felixge/httpsnoop v1.0.4 // indirect
118119
github.com/fsnotify/fsnotify v1.6.0 // indirect
119120
github.com/gammazero/deque v0.2.1 // indirect
@@ -183,6 +184,7 @@ require (
183184
github.com/hashicorp/go-secure-stdlib/awsutil v0.3.0 // indirect
184185
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 // indirect
185186
github.com/hashicorp/go-secure-stdlib/mlock v0.1.3 // indirect
187+
github.com/hashicorp/go-secure-stdlib/nonceutil v0.1.0 // indirect
186188
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect
187189
github.com/hashicorp/go-secure-stdlib/password v0.1.1 // indirect
188190
github.com/hashicorp/go-secure-stdlib/plugincontainer v0.3.0 // indirect
@@ -194,6 +196,7 @@ require (
194196
github.com/hashicorp/go-uuid v1.0.3 // indirect
195197
github.com/hashicorp/go-version v1.6.0 // indirect
196198
github.com/hashicorp/golang-lru v1.0.2 // indirect
199+
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
197200
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
198201
github.com/hashicorp/hcp-sdk-go v0.75.0 // indirect
199202
github.com/hashicorp/mdns v1.0.4 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,8 @@ github.com/hashicorp/vault-testing-stepwise v0.1.4 h1:Lsv1KdpQyjhvmLgKeH65FG5MmY
867867
github.com/hashicorp/vault-testing-stepwise v0.1.4/go.mod h1:Ym1T/kMM2sT6qgCIIJ3an7uaSWCJ8O7ohsWB9UiB5tI=
868868
github.com/hashicorp/vault/api v1.12.0 h1:meCpJSesvzQyao8FCOgk2fGdoADAnbDu2WPJN1lDLJ4=
869869
github.com/hashicorp/vault/api v1.12.0/go.mod h1:si+lJCYO7oGkIoNPAN8j3azBLTn9SjMGS+jFaHd1Cck=
870+
github.com/hashicorp/vault/api/auth/userpass v0.1.0 h1:C6OdAYczMbzd1Pe1LLf2SHDulxOq/iybWV3kbgV/PS4=
871+
github.com/hashicorp/vault/api/auth/userpass v0.1.0/go.mod h1:0orUbtkEwbEPmaQ+wvfrOddGBimLJnuN8A/J0PNfBks=
870872
github.com/hashicorp/vault/sdk v0.12.0 h1:c2WeMWtF08zKQmrJya7paM4IVnsXIXF5UlhQTBdwZwQ=
871873
github.com/hashicorp/vault/sdk v0.12.0/go.mod h1:2kN1F5owc/Yh1OwL32GGnYrX9E3vFOIKA/cGJxCNQ30=
872874
github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443 h1:O/pT5C1Q3mVXMyuqg7yuAWUg/jMZR1/0QTzTRdNR6Uw=

pkg/auth/vault/certificate.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ func (a *CertificateAuth) Authenticate(vaultClient *api.Client) error {
6464

6565
apiClientConfig := vaultClient.CloneConfig()
6666

67-
tlsConfig := &api.TLSConfig{
67+
/*tlsConfig := &api.TLSConfig{
6868
ClientKey: tempKey.Name(),
6969
ClientCert: tempCrt.Name(),
7070
}
7171
7272
err = apiClientConfig.ConfigureTLS(tlsConfig)
7373
if err != nil {
7474
return err
75-
}
75+
}*/
7676

7777
certVaultClient, err := api.NewClient(apiClientConfig)
7878

@@ -81,6 +81,8 @@ func (a *CertificateAuth) Authenticate(vaultClient *api.Client) error {
8181
}
8282

8383
utils.VerboseToStdErr("Hashicorp Vault authenticating with certificate")
84+
85+
certVaultClient.ClearToken()
8486
data, err := certVaultClient.Logical().Write(fmt.Sprintf("%s/login", a.MountPath), payload)
8587
if err != nil {
8688
return err

pkg/auth/vault/certificate_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import (
1010
)
1111

1212
func TestCertificateLogin(t *testing.T) {
13-
cluster, cert, key := helpers.CreateTestCertificateVault(t)
13+
cluster, _, _ := helpers.CreateTestCertificateVault(t)
1414
defer cluster.Cleanup()
1515

16-
certificateAuth := vault.NewCertificateAuth(cert, key, "")
16+
certificateAuth := vault.NewCertificateAuth("", "", "")
1717

1818
err := certificateAuth.Authenticate(cluster.Cores[0].Client)
1919
if err != nil {

pkg/helpers/test_helpers.go

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
package helpers
22

33
import (
4+
"crypto/rand"
5+
"crypto/rsa"
6+
"crypto/x509"
7+
"crypto/x509/pkix"
8+
"encoding/pem"
49
"fmt"
5-
"net"
6-
"strconv"
7-
"testing"
8-
910
"github.com/hashicorp/go-hclog"
1011
kv "github.com/hashicorp/vault-plugin-secrets-kv"
1112
"github.com/hashicorp/vault/api"
1213
credAppRole "github.com/hashicorp/vault/builtin/credential/approle"
1314
credCert "github.com/hashicorp/vault/builtin/credential/cert"
1415
credUserPass "github.com/hashicorp/vault/builtin/credential/userpass"
16+
"github.com/hashicorp/vault/builtin/logical/pki"
1517
"github.com/hashicorp/vault/http"
1618
"github.com/hashicorp/vault/sdk/logical"
1719
"github.com/hashicorp/vault/vault"
20+
"math/big"
21+
"net"
22+
"strconv"
23+
"testing"
24+
"time"
1825
)
1926

2027
// Test Constants
@@ -302,7 +309,8 @@ func CreateTestCertificateVault(t *testing.T) (*vault.TestCluster, string, strin
302309

303310
coreConfig := &vault.CoreConfig{
304311
LogicalBackends: map[string]logical.Factory{
305-
"kv": kv.Factory,
312+
"kv": kv.Factory,
313+
"pki": pki.Factory,
306314
},
307315
CredentialBackends: map[string]logical.Factory{
308316
"cert": credCert.Factory,
@@ -333,8 +341,17 @@ func CreateTestCertificateVault(t *testing.T) (*vault.TestCluster, string, strin
333341
t.Fatal(err)
334342
}
335343

344+
write, err := client.Logical().Write("auth/cert/certs/vault-cert", map[string]interface{}{
345+
"display_name": "vault-cert",
346+
"policies": "cert-kv,cert-secret",
347+
"certificate": string(cluster.CACertPEM),
348+
})
349+
if err != nil && write == nil {
350+
return nil, "", ""
351+
}
352+
336353
// Create Policy for secret/foo
337-
err := client.Sys().PutPolicy("cert-secret", "path \"secret/*\" { capabilities = [\"read\",\"list\"] }")
354+
err = client.Sys().PutPolicy("cert-secret", "path \"secret/*\" { capabilities = [\"read\",\"list\"] }")
338355
if err != nil {
339356
t.Fatal(err)
340357
}
@@ -345,15 +362,6 @@ func CreateTestCertificateVault(t *testing.T) (*vault.TestCluster, string, strin
345362
t.Fatal(err)
346363
}
347364

348-
_, err = client.Logical().Write("auth/approle/role/role1", map[string]interface{}{
349-
"bind_secret_id": "true",
350-
"period": "300",
351-
"policies": "cert-secret, cert-kv",
352-
})
353-
if err != nil {
354-
t.Fatal(err)
355-
}
356-
357365
_, err = client.Logical().Write("secret/testing", map[string]interface{}{
358366
"name": "test-name",
359367
"namespace": "test-namespace",
@@ -463,19 +471,49 @@ func CreateTestCertificateVault(t *testing.T) (*vault.TestCluster, string, strin
463471
t.Fatal(err)
464472
}
465473

466-
secret, err := client.Logical().Write("auth/approle/role/role1/secret-id", nil)
474+
key, err := rsa.GenerateKey(rand.Reader, 2048)
467475
if err != nil {
468476
t.Fatal(err)
469477
}
470-
secretID := secret.Data["secret_id"].(string)
478+
privateKeyPEM := pem.EncodeToMemory(&pem.Block{
479+
Type: "RSA PRIVATE KEY",
480+
Bytes: x509.MarshalPKCS1PrivateKey(key),
481+
})
471482

472-
secret, err = client.Logical().Read("auth/approle/role/role1/role-id")
483+
csrTemplate := x509.CertificateRequest{
484+
Subject: pkix.Name{
485+
CommonName: "vault-cert",
486+
Organization: []string{"Client Org"},
487+
},
488+
}
489+
csrBytes, err := x509.CreateCertificateRequest(rand.Reader, &csrTemplate, key)
473490
if err != nil {
474491
t.Fatal(err)
475492
}
476-
roleID := secret.Data["role_id"].(string)
477493

478-
return cluster, roleID, secretID
494+
csr, err := x509.ParseCertificateRequest(csrBytes)
495+
if err != nil {
496+
t.Fatal(err)
497+
}
498+
499+
clientCertTemplate := x509.Certificate{
500+
SerialNumber: big.NewInt(1234567890), // Eine eindeutige Seriennummer
501+
Subject: csr.Subject,
502+
NotBefore: time.Now(),
503+
NotAfter: time.Now().Add(365 * 24 * time.Hour), // 1 Jahr Gültigkeit
504+
KeyUsage: x509.KeyUsageDigitalSignature,
505+
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
506+
}
507+
clientCertBytes, err := x509.CreateCertificate(rand.Reader, &clientCertTemplate, cluster.CACert, csr.PublicKey, cluster.CAKey)
508+
if err != nil {
509+
t.Fatal(err)
510+
}
511+
512+
clientCertPEM := pem.EncodeToMemory(&pem.Block{
513+
Type: "CERTIFICATE",
514+
Bytes: clientCertBytes,
515+
})
516+
return cluster, string(clientCertPEM), string(privateKeyPEM)
479517
}
480518

481519
// CreateTestGithubVault initializes a new test vault with AppRole and Kv v2

0 commit comments

Comments
 (0)