blob: 243a4241c222a33db67a97408d8d6263c2059623 [file] [log] [blame]
Serge Bazanskif3312ef2020-08-01 17:15:52 +02001package main
2
3import (
4 "encoding/pem"
5 "fmt"
6 "time"
7
8 "github.com/cloudflare/cfssl/config"
9 "github.com/cloudflare/cfssl/csr"
10 "github.com/cloudflare/cfssl/helpers"
11 "github.com/cloudflare/cfssl/signer"
12 "github.com/cloudflare/cfssl/signer/local"
13 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
15 pb "code.hackerspace.pl/hscloud/cluster/prodvider/proto"
16)
17
18func (p *prodvider) hspkiSigner() (*local.Signer, error) {
19 policy := &config.Signing{
20 Profiles: map[string]*config.SigningProfile{
21 "client": &config.SigningProfile{
22 Usage: []string{"signing", "key encipherment", "client auth"},
23 ExpiryString: "30d",
24 },
25 },
26 Default: config.DefaultConfig(),
27 }
28
29 secret, err := p.k8s.CoreV1().Secrets("cert-manager").Get("pki-selfsigned-cert", metav1.GetOptions{})
30 if err != nil {
31 return nil, fmt.Errorf("hspki secret get failed: %w", err)
32 }
33
34 parsedCa, err := helpers.ParseCertificatePEM(secret.Data["tls.crt"])
35 if err != nil {
36 return nil, fmt.Errorf("when parsing tls.crt: %w", err)
37 }
38
39 priv, err := helpers.ParsePrivateKeyPEMWithPassword(secret.Data["tls.key"], nil)
40 if err != nil {
41 return nil, fmt.Errorf("when parsing tls.key: %w", err)
42 }
43
44 return local.NewSigner(priv, parsedCa, signer.DefaultSigAlgo(priv), policy)
45}
46
47func (p *prodvider) hspkiCreds(username string) (*pb.HSPKIKeys, error) {
48 principal := fmt.Sprintf("%s.sso.hswaw.net", username)
49
50 s, err := p.hspkiSigner()
51 if err != nil {
52 return nil, fmt.Errorf("hspkiSigner: %w", err)
53 }
54
55 signerCert, _ := s.Certificate("", "")
56 req := &csr.CertificateRequest{
57 CN: principal,
58 KeyRequest: &csr.BasicKeyRequest{
59 A: "rsa",
60 S: 4096,
61 },
62 Names: []csr.Name{
63 {
64 O: "prodvider",
65 OU: fmt.Sprintf("Prodvider HSPKI Cert for %s", username),
66 },
67 },
68 }
69
70 g := &csr.Generator{
71 Validator: func(req *csr.CertificateRequest) error { return nil },
72 }
73
74 csrPEM, keyPEM, err := g.ProcessRequest(req)
75 if err != nil {
76 return nil, fmt.Errorf("when making CSR: %w", err)
77 }
78
79 signReq := signer.SignRequest{
80 Hosts: []string{},
81 Request: string(csrPEM),
82 Profile: "client",
83 NotAfter: time.Now().Add(9 * time.Hour),
84 }
85
86 certPEM, err := s.Sign(signReq)
87 if err != nil {
88 return nil, fmt.Errorf("when issuing certificate: %w", err)
89 }
90
91 caPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: signerCert.Raw})
92
93 return &pb.HSPKIKeys{
94 Ca: caPEM,
95 Cert: certPEM,
96 Key: keyPEM,
97 Principal: principal,
98 }, nil
99}