@@ -23,6 +23,7 @@ import (
23
23
"context"
24
24
"crypto/x509/pkix"
25
25
"encoding/json"
26
+ "os"
26
27
27
28
"emperror.dev/errors"
28
29
"github.com/spf13/cobra"
@@ -37,6 +38,10 @@ import (
37
38
"github.com/cisco-open/camblet/pkg/tls"
38
39
)
39
40
41
+ const (
42
+ defaultRootCACommonName = "Camblet root CA"
43
+ )
44
+
40
45
type agentCommand struct {
41
46
cli cli.CLI
42
47
}
@@ -62,7 +67,7 @@ func NewCommand(c cli.CLI) *cobra.Command {
62
67
cmd .Flags ().StringSlice ("services-path" , config .DefaultServicesPaths , "Path to file or directory for service definitions" )
63
68
cmd .Flags ().String ("trust-domain" , config .DefaultTrustDomain , "Trust domain" )
64
69
cmd .Flags ().Duration ("default-cert-ttl" , config .DefaultCertTTLDuration , "Default certificate TTL" )
65
- cmd .Flags ().String ("ca-pem-path" , "" , "Path for CA pem" )
70
+ cmd .Flags ().String ("ca-pem-path" , config . DefaultCAPEMPath , "Path for CA pem" )
66
71
67
72
cli .BindCMDFlags (c .Viper (), cmd )
68
73
@@ -82,20 +87,12 @@ func (c *agentCommand) runCommander(ctx context.Context) error {
82
87
h .AddHandler ("connect" , commands .Connect ())
83
88
84
89
caOpts := []tls.CertificateAuthorityOption {}
85
- if c .cli .Configuration ().Agent .CAPemPath == "" {
86
- if cert , pkey , err := tls .CreateSelfSignedCACertificate (tls.CertificateOptions {
87
- Subject : pkix.Name {
88
- CommonName : "Camblet root CA" ,
89
- },
90
- }); err != nil {
91
- return errors .WrapIf (err , "could not create self signed root CA certificate" )
92
- } else {
93
- caOpts = append (caOpts , tls .CertificateAuthorityWithPEM (append (cert .GetPEM (), pkey .GetPEM ()... )))
94
- }
95
- } else {
96
- caOpts = append (caOpts , tls .CertificateAuthorityWithPEMFile (c .cli .Configuration ().Agent .CAPemPath ))
90
+ caPEMPath , err := c .ensureCACertificate ()
91
+ if err != nil {
92
+ return errors .WithStackIf (err )
97
93
}
98
94
95
+ caOpts = append (caOpts , tls .CertificateAuthorityWithPEMFile (caPEMPath ))
99
96
ca , err := tls .NewCertificateAuthority (caOpts ... )
100
97
if err != nil {
101
98
return err
@@ -105,6 +102,8 @@ func (c *agentCommand) runCommander(ctx context.Context) error {
105
102
if err != nil {
106
103
return err
107
104
}
105
+ c .cli .Logger ().Info ("CA signer initialized" , "caPEMPath" , caPEMPath )
106
+
108
107
h .AddHandler ("csr_sign" , csrSign )
109
108
110
109
collector := collectors .GetMetadataCollector (c .cli .Configuration ().Agent .MetadataCollectors , c .cli .Logger ())
@@ -117,6 +116,35 @@ func (c *agentCommand) runCommander(ctx context.Context) error {
117
116
return nil
118
117
}
119
118
119
+ func (c * agentCommand ) ensureCACertificate () (string , error ) {
120
+ path := c .cli .Configuration ().Agent .CAPemPath
121
+
122
+ if _ , err := os .Stat (path ); path != "" && err == nil {
123
+ return path , nil
124
+ }
125
+
126
+ cert , pkey , err := tls .CreateSelfSignedCACertificate (tls.CertificateOptions {
127
+ Subject : pkix.Name {
128
+ CommonName : defaultRootCACommonName ,
129
+ },
130
+ })
131
+ if err != nil {
132
+ return "" , errors .WrapIf (err , "could not generate self signed root CA certificate" )
133
+ }
134
+
135
+ if file , err := os .Create (path ); err != nil {
136
+ return "" , errors .WrapIf (err , "could not write generated self signed root CA certificate" )
137
+ } else {
138
+ defer file .Close ()
139
+ if _ , err := file .Write (append (cert .GetPEM (), pkey .GetPEM ()... )); err != nil {
140
+ return "" , errors .WrapIf (err , "could not write generated self signed root CA certificate" )
141
+ }
142
+ c .cli .Logger ().Info ("self signed root CA certificate is created and saved" , "path" , path )
143
+ }
144
+
145
+ return path , nil
146
+ }
147
+
120
148
func (c * agentCommand ) run (cmd * cobra.Command ) error {
121
149
logger := c .cli .Logger ()
122
150
eventBus := c .cli .EventBus ()
0 commit comments