Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package acmeserver
import (
"io/ioutil"
"log"
"path/filepath"
"gopkg.in/yaml.v2"
"git.autistici.org/ai3/go-common/clientutil"
)
// Config holds the configuration for an acmeserver instance.
type Config struct {
Addr string `yaml:"addr"`
Email string `yaml:"email"`
UseRSA bool `yaml:"use_rsa"`
Dir string `yaml:"cert_dir"`
ReplDS *clientutil.BackendConfig `yaml:"replds"`
}
// Definition of a single certificate: the main CN, and optionally a
// list of subjectAltName entries.
type certConfig struct {
CN string `yaml:"cn"`
AltNames []string `yaml:"alt_names"`
}
func decodeCertConfig(data []byte) ([][]string, error) {
var cc []certConfig
if err := yaml.Unmarshal(data, &cc); err != nil {
return nil, err
}
var domains [][]string
for _, c := range cc {
d := []string{c.CN}
d = append(d, c.AltNames...)
domains = append(domains, d)
}
return domains, nil
}
func readCertConfig(path string) ([][]string, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
return decodeCertConfig(data)
}
func readCertConfigsFromDir(dir string) ([][]string, error) {
files, err := filepath.Glob(filepath.Join(dir, "*.yml"))
if err != nil {
return nil, err
}
var domains [][]string
for _, f := range files {
d, err := readCertConfig(f)
if err != nil {
log.Printf("error reading %s: %v", f, err)
continue
}
domains = append(domains, d...)
}
return domains, nil
}