func mustNewCA() (string, string) { cert.KeyBits = 512 caCert, caKey, err := cert.NewCA("juju testing", time.Now().AddDate(10, 0, 0)) if err != nil { panic(err) } return string(caCert), string(caKey) }
func (certSuite) TestWithNonUTCExpiry(c *gc.C) { expiry, err := time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", "2012-11-28 15:53:57 +0100 CET") c.Assert(err, gc.IsNil) certPEM, keyPEM, err := cert.NewCA("foo", expiry) xcert, err := cert.ParseCert(certPEM) c.Assert(err, gc.IsNil) c.Assert(xcert.NotAfter.Equal(expiry), gc.Equals, true) var noHostnames []string certPEM, _, err = cert.NewServer(certPEM, keyPEM, expiry, noHostnames) xcert, err = cert.ParseCert(certPEM) c.Assert(err, gc.IsNil) c.Assert(xcert.NotAfter.Equal(expiry), gc.Equals, true) }
// ensureCertificates ensures that a CA certificate, // server certificate, and private key exist in the log // directory, and writes them if not. The CA certificate // is entered into the environment configuration to be // picked up by other agents. func (h *RsyslogConfigHandler) ensureCertificates() error { // We write ca-cert.pem last, after propagating into state. // If it's there, then there's nothing to do. Otherwise, // start over. caCertPEM := h.syslogConfig.CACertPath() if _, err := os.Stat(caCertPEM); err == nil { return nil } // Files must be chowned to syslog:adm. syslogUid, syslogGid, err := lookupUser("syslog") if err != nil { return err } // Generate a new CA and server cert/key pairs. // The CA key will be discarded after the server // cert has been generated. expiry := time.Now().UTC().AddDate(10, 0, 0) caCertPEM, caKeyPEM, err := cert.NewCA("rsyslog", expiry) if err != nil { return err } rsyslogCertPEM, rsyslogKeyPEM, err := cert.NewServer(caCertPEM, caKeyPEM, expiry, nil) if err != nil { return err } // Update the environment config with the CA cert, // so clients can configure rsyslog. if err := h.st.SetRsyslogCert(caCertPEM); err != nil { return err } // Write the certificates and key. The CA certificate must be written last for idempotency. for _, pair := range []struct { path string data string }{ {h.syslogConfig.ServerCertPath(), rsyslogCertPEM}, {h.syslogConfig.ServerKeyPath(), rsyslogKeyPEM}, {h.syslogConfig.CACertPath(), caCertPEM}, } { if err := writeFileAtomic(pair.path, []byte(pair.data), 0600, syslogUid, syslogGid); err != nil { return err } } return nil }
func (certSuite) TestNewCA(c *gc.C) { expiry := roundTime(time.Now().AddDate(0, 0, 1)) caCertPEM, caKeyPEM, err := cert.NewCA("foo", expiry) c.Assert(err, gc.IsNil) caCert, caKey, err := cert.ParseCertAndKey(caCertPEM, caKeyPEM) c.Assert(err, gc.IsNil) c.Assert(caKey, gc.FitsTypeOf, (*rsa.PrivateKey)(nil)) c.Assert(caCert.Subject.CommonName, gc.Equals, `juju-generated CA for environment "foo"`) c.Assert(caCert.NotAfter.Equal(expiry), gc.Equals, true) c.Assert(caCert.BasicConstraintsValid, gc.Equals, true) c.Assert(caCert.IsCA, gc.Equals, true) //c.Assert(caCert.MaxPathLen, Equals, 0) TODO it ends up as -1 - check that this is ok. }
func (certSuite) TestVerify(c *gc.C) { now := time.Now() caCert, caKey, err := cert.NewCA("foo", now.Add(1*time.Minute)) c.Assert(err, gc.IsNil) var noHostnames []string srvCert, _, err := cert.NewServer(caCert, caKey, now.Add(3*time.Minute), noHostnames) c.Assert(err, gc.IsNil) err = cert.Verify(srvCert, caCert, now) c.Assert(err, gc.IsNil) err = cert.Verify(srvCert, caCert, now.Add(55*time.Second)) c.Assert(err, gc.IsNil) // TODO(rog) why does this succeed? // err = cert.Verify(srvCert, caCert, now.Add(-1 * time.Minute)) //c.Check(err, gc.ErrorMatches, "x509: certificate has expired or is not yet valid") err = cert.Verify(srvCert, caCert, now.Add(2*time.Minute)) c.Check(err, gc.ErrorMatches, "x509: certificate has expired or is not yet valid") caCert2, caKey2, err := cert.NewCA("bar", now.Add(1*time.Minute)) c.Assert(err, gc.IsNil) // Check original server certificate against wrong CA. err = cert.Verify(srvCert, caCert2, now) c.Check(err, gc.ErrorMatches, "x509: certificate signed by unknown authority") srvCert2, _, err := cert.NewServer(caCert2, caKey2, now.Add(1*time.Minute), noHostnames) c.Assert(err, gc.IsNil) // Check new server certificate against original CA. err = cert.Verify(srvCert2, caCert, now) c.Check(err, gc.ErrorMatches, "x509: certificate signed by unknown authority") }
// ensureCertificate generates a new CA certificate and // attaches it to the given environment configuration, // unless the configuration already has one. func ensureCertificate(cfg *config.Config) (*config.Config, error) { _, hasCACert := cfg.CACert() _, hasCAKey := cfg.CAPrivateKey() if hasCACert && hasCAKey { return cfg, nil } if hasCACert && !hasCAKey { return nil, fmt.Errorf("environment configuration with a certificate but no CA private key") } caCert, caKey, err := cert.NewCA(cfg.Name(), time.Now().UTC().AddDate(10, 0, 0)) if err != nil { return nil, err } return cfg.Apply(map[string]interface{}{ "ca-cert": string(caCert), "ca-private-key": string(caKey), }) }
func (certSuite) TestNewServer(c *gc.C) { expiry := roundTime(time.Now().AddDate(1, 0, 0)) caCertPEM, caKeyPEM, err := cert.NewCA("foo", expiry) c.Assert(err, gc.IsNil) caCert, _, err := cert.ParseCertAndKey(caCertPEM, caKeyPEM) c.Assert(err, gc.IsNil) var noHostnames []string srvCertPEM, srvKeyPEM, err := cert.NewServer(caCertPEM, caKeyPEM, expiry, noHostnames) c.Assert(err, gc.IsNil) srvCert, srvKey, err := cert.ParseCertAndKey(srvCertPEM, srvKeyPEM) c.Assert(err, gc.IsNil) c.Assert(srvCert.Subject.CommonName, gc.Equals, "*") c.Assert(srvCert.NotAfter.Equal(expiry), gc.Equals, true) c.Assert(srvCert.BasicConstraintsValid, gc.Equals, false) c.Assert(srvCert.IsCA, gc.Equals, false) c.Assert(srvCert.ExtKeyUsage, gc.DeepEquals, []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}) checkTLSConnection(c, caCert, srvCert, srvKey) }