aboutsummaryrefslogtreecommitdiff
path: root/cmd/acmed/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/acmed/main.go')
-rw-r--r--cmd/acmed/main.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/cmd/acmed/main.go b/cmd/acmed/main.go
index 06ab7d0..01691e5 100644
--- a/cmd/acmed/main.go
+++ b/cmd/acmed/main.go
@@ -1 +1,84 @@
package main
+
+import (
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/x509"
+ "encoding/pem"
+ "flag"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "path"
+)
+
+var confName = flag.String("conf", "acme.toml", "configuration file")
+
+func newKey(w io.Writer, size int) (*rsa.PrivateKey, error) {
+ key, err := rsa.GenerateKey(rand.Reader, size)
+ if err != nil {
+ return nil, err
+ }
+ block := &pem.Block{
+ Type: "RSA PRIVATE KEY",
+ Bytes: x509.MarshalPKCS1PrivateKey(key),
+ }
+ return key, pem.Encode(w, block)
+}
+
+func chkKey(baseDir string, k Keychain) (*rsa.PrivateKey, error) {
+ key := path.Join(baseDir, k.Path())
+ flags := os.O_WRONLY | os.O_CREATE | os.O_TRUNC
+ if _, err := os.Stat(key); os.IsNotExist(err) {
+ log.Println("allocating", key, k.Size())
+ if err := os.MkdirAll(path.Dir(key), 0700); err != nil {
+ return nil, err
+ }
+ fd, err := os.OpenFile(key, flags, 0600)
+ if err != nil {
+ return nil, err
+ }
+ defer fd.Close()
+ return newKey(fd, k.Size())
+ } else {
+ der, err := ioutil.ReadFile(key)
+ if err != nil {
+ return nil, err
+ }
+ block, _ := pem.Decode(der)
+ return x509.ParsePKCS1PrivateKey(block.Bytes)
+ }
+}
+
+func main() {
+ flag.Parse()
+ conf, err := LoadConfig(*confName)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for k, acc := range conf.Account {
+ if acc.KeySize == 0 {
+ acc.KeySize = conf.Defaults.KeySize
+ }
+ acc.key, err = chkKey(conf.Defaults.Basedir, acc)
+ if err != nil {
+ log.Fatal(err)
+ }
+ conf.Account[k] = acc
+ }
+
+ for k, des := range conf.Desire {
+ if des.KeySize == 0 {
+ des.KeySize = conf.Defaults.KeySize
+ }
+ des.key, err = chkKey(conf.Defaults.Basedir, des)
+ if err != nil {
+ log.Fatal(err)
+ }
+ conf.Desire[k] = des
+ }
+
+ log.Println(conf)
+}