in pkg/mesh/certs.go [47:109]
func (kr *KRun) InitCertificates(ctx context.Context, outDir string) error {
var err error
keyFile := filepath.Join(outDir, privateKey)
chainFile := filepath.Join(outDir, cert)
if outDir != "" {
kp, err := tls.LoadX509KeyPair(chainFile, keyFile)
if err == nil && len(kp.Certificate) > 0 {
kp.Leaf, _ = x509.ParseCertificate(kp.Certificate[0])
exp := kp.Leaf.NotAfter.Sub(time.Now())
if exp > -5 * time.Minute {
kr.X509KeyPair = &kp
log.Println("Existing Cert", "expires", exp)
return nil
}
}
}
if kr.CSRSigner == nil {
return nil
}
// TODO: decode WorkloadCertificateConfig, use EC256 or RSA
privPEM, csr, err := kr.NewCSR("rsa", kr.TrustDomain, "spiffe://"+kr.TrustDomain+"/ns/"+kr.Namespace+"/sa/"+kr.KSA)
if err != nil {
return err
}
chain, err := kr.CSRSigner.CSRSign(ctx, csr, 24*3600)
if err != nil {
return err
}
certChain := strings.Join(chain, "\n")
kp, err := tls.X509KeyPair([]byte(certChain), privPEM)
kr.X509KeyPair = &kp
if err == nil && len(kp.Certificate) > 0 {
kp.Leaf, _ = x509.ParseCertificate(kp.Certificate[0])
if !kp.Leaf.NotAfter.Before(time.Now()) {
r, _ := x509.ParseCertificate(kp.Certificate[len(kp.Certificate) - 1])
log.Println("New Cert", "expires", kp.Leaf.NotAfter, "signer", r.Subject)
}
}
if outDir != "" {
os.MkdirAll(outDir, 0755)
err = ioutil.WriteFile(keyFile, privPEM, 0660)
if err != nil {
return err
}
err = ioutil.WriteFile(chainFile, []byte(certChain), 0660)
if err != nil {
return err
}
if os.Getuid() == 0 {
os.Chown(outDir, 1337, 1337)
os.Chown(keyFile, 1337, 1337)
os.Chown(chainFile, 1337, 1337)
}
}
// The roots are extracted from the mesh env.
return err
}