1
0
mirror of https://github.com/rancher/os.git synced 2025-06-03 20:30:15 +00:00
os/cmd/control/tlsconf.go

159 lines
3.6 KiB
Go
Raw Normal View History

2015-02-23 19:00:33 +00:00
package control
2015-02-19 20:48:10 +00:00
import (
2015-03-16 20:50:30 +00:00
"io/ioutil"
2015-02-19 20:48:10 +00:00
"os"
"path/filepath"
2015-03-16 20:50:30 +00:00
log "github.com/Sirupsen/logrus"
2015-02-21 21:31:10 +00:00
"github.com/codegangsta/cli"
2015-02-19 20:48:10 +00:00
machineUtil "github.com/docker/machine/utils"
2015-03-16 20:50:30 +00:00
"github.com/rancherio/os/config"
)
const (
NAME string = "rancher"
BITS int = 2048
2015-02-19 20:48:10 +00:00
)
2015-02-21 21:31:10 +00:00
func tlsConfCommands() []cli.Command {
2015-02-23 19:00:33 +00:00
return []cli.Command{
2015-02-21 21:31:10 +00:00
{
2015-03-16 20:50:30 +00:00
Name: "generate",
Usage: "generates new set of TLS configuration certs",
2015-02-21 21:31:10 +00:00
Action: tlsConfCreate,
2015-02-23 19:00:33 +00:00
Flags: []cli.Flag{
2015-03-16 20:50:30 +00:00
cli.StringSliceFlag{
Name: "hostname",
Usage: "the hostname for which you want to generate the certificate",
Value: &cli.StringSlice{"localhost"},
2015-02-21 21:31:10 +00:00
},
2015-02-23 19:00:33 +00:00
cli.BoolFlag{
2015-03-16 20:50:30 +00:00
Name: "server, s",
Usage: "generate the server keys instead of client keys",
2015-02-21 21:31:10 +00:00
},
2015-02-23 19:00:33 +00:00
cli.StringFlag{
2015-03-16 20:50:30 +00:00
Name: "dir, d",
Usage: "the directory to save/read the certs to/from",
Value: "${HOME}/.docker",
2015-02-21 21:31:10 +00:00
},
},
},
}
2015-02-23 19:00:33 +00:00
}
2015-02-21 21:31:10 +00:00
2015-03-16 20:50:30 +00:00
func writeCerts(generateServer bool, hostname []string, cfg *config.Config, certPath, keyPath, caCertPath, caKeyPath string) error {
if !generateServer {
return machineUtil.GenerateCert([]string{""}, certPath, keyPath, caCertPath, caKeyPath, NAME, BITS)
}
2015-02-19 20:48:10 +00:00
2015-03-16 20:50:30 +00:00
if cfg.UserDocker.ServerKey == "" || cfg.UserDocker.ServerCert == "" {
err := machineUtil.GenerateCert(hostname, certPath, keyPath, caCertPath, caKeyPath, NAME, BITS)
if err != nil {
return err
}
2015-02-19 20:48:10 +00:00
2015-03-16 20:50:30 +00:00
cert, err := ioutil.ReadFile(certPath)
if err != nil {
return err
}
2015-02-23 19:00:33 +00:00
2015-03-16 20:50:30 +00:00
key, err := ioutil.ReadFile(keyPath)
if err != nil {
return err
}
2015-02-23 19:00:33 +00:00
2015-03-16 20:50:30 +00:00
return cfg.SetConfig(&config.Config{
UserDocker: config.DockerConfig{
CAKey: cfg.UserDocker.CAKey,
CACert: cfg.UserDocker.CACert,
ServerCert: string(cert),
ServerKey: string(key),
},
})
2015-02-21 21:31:10 +00:00
}
2015-03-16 20:50:30 +00:00
if err := ioutil.WriteFile(certPath, []byte(cfg.UserDocker.ServerCert), 0400); err != nil {
return err
2015-02-23 19:00:33 +00:00
}
2015-02-19 20:48:10 +00:00
2015-03-16 20:50:30 +00:00
return ioutil.WriteFile(keyPath, []byte(cfg.UserDocker.ServerKey), 0400)
2015-02-19 20:48:10 +00:00
2015-03-16 20:50:30 +00:00
}
2015-02-21 21:31:10 +00:00
2015-03-16 20:50:30 +00:00
func writeCaCerts(cfg *config.Config, caCertPath, caKeyPath string) error {
if cfg.UserDocker.CACert == "" {
if err := machineUtil.GenerateCACertificate(caCertPath, caKeyPath, NAME, BITS); err != nil {
return err
2015-02-19 20:48:10 +00:00
}
2015-03-16 20:50:30 +00:00
caCert, err := ioutil.ReadFile(caCertPath)
if err != nil {
return err
}
2015-02-19 20:48:10 +00:00
2015-03-16 20:50:30 +00:00
caKey, err := ioutil.ReadFile(caKeyPath)
if err != nil {
return err
2015-02-19 20:48:10 +00:00
}
2015-03-16 20:50:30 +00:00
err = cfg.SetConfig(&config.Config{
UserDocker: config.DockerConfig{
CAKey: string(caKey),
CACert: string(caCert),
},
})
if err != nil {
return err
2015-02-19 20:48:10 +00:00
}
2015-03-16 20:50:30 +00:00
return nil
}
if err := ioutil.WriteFile(caCertPath, []byte(cfg.UserDocker.CACert), 0400); err != nil {
return err
}
return ioutil.WriteFile(caKeyPath, []byte(cfg.UserDocker.CAKey), 0400)
}
func tlsConfCreate(c *cli.Context) {
err := generate(c)
if err != nil {
log.Fatal(err)
}
}
func generate(c *cli.Context) error {
cfg, err := config.LoadConfig()
if err != nil {
return err
2015-02-19 20:48:10 +00:00
}
2015-03-16 20:50:30 +00:00
generateServer := c.Bool("server")
outDir := os.ExpandEnv(c.String("dir"))
caCertPath := filepath.Join(outDir, "ca.pem")
caKeyPath := filepath.Join(outDir, "ca-key.pem")
certPath := filepath.Join(outDir, "cert.pem")
keyPath := filepath.Join(outDir, "key.pem")
2015-02-19 20:48:10 +00:00
2015-03-16 20:50:30 +00:00
if generateServer {
certPath = filepath.Join(outDir, "server-cert.pem")
keyPath = filepath.Join(outDir, "server-key.pem")
2015-02-19 20:48:10 +00:00
}
2015-03-16 20:50:30 +00:00
if _, err := os.Stat(outDir); os.IsNotExist(err) {
if err := os.MkdirAll(outDir, 0700); err != nil {
return err
}
}
if err := writeCaCerts(cfg, caCertPath, caKeyPath); err != nil {
return err
}
hostnames := c.StringSlice("hostname")
return writeCerts(generateServer, hostnames, cfg, certPath, keyPath, caCertPath, caKeyPath)
2015-02-19 20:48:10 +00:00
}