Skip to content

Commit da4da8a

Browse files
committed
Refactor output path flags
1 parent 5ea72c3 commit da4da8a

File tree

3 files changed

+44
-127
lines changed

3 files changed

+44
-127
lines changed

cert.go

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"crypto/x509/pkix"
1313
"encoding/asn1"
1414
"encoding/pem"
15-
"errors"
1615
"io/ioutil"
1716
"log"
1817
"math/big"
@@ -40,34 +39,6 @@ func init() {
4039
userAndHostname += strings.TrimSpace(string(out))
4140
}
4241

43-
// getFileName generate file name according to flags
44-
func (m *mkcert) getFileName(w string, args []string) (name string, err error) {
45-
filename := strings.Replace(args[0], ":", "_", -1)
46-
filename = strings.Replace(filename, "*", "_wildcard", -1)
47-
if len(args) > 1 {
48-
filename += "+" + strconv.Itoa(len(args)-1)
49-
}
50-
switch w {
51-
case "key":
52-
if m.keyFileFlag != "" {
53-
return m.keyFileFlag, nil
54-
}
55-
return filename + "-key.pem", nil
56-
case "cert":
57-
if m.certFileFlag != "" {
58-
return m.certFileFlag, nil
59-
}
60-
return filename + ".pem", nil
61-
case "p12":
62-
if m.p12FileFlag != "" {
63-
return m.p12FileFlag, nil
64-
}
65-
return filename + ".p12", nil
66-
default:
67-
return "", errors.New("failed to generate file name")
68-
}
69-
}
70-
7142
func (m *mkcert) makeCert(hosts []string) {
7243
if m.caKey == nil {
7344
log.Fatalln("ERROR: can't create new certificates because the CA key (rootCA-key.pem) is missing")
@@ -105,28 +76,24 @@ func (m *mkcert) makeCert(hosts []string) {
10576
pub := priv.PublicKey
10677
cert, err := x509.CreateCertificate(rand.Reader, tpl, m.caCert, &pub, m.caKey)
10778
fatalIfErr(err, "failed to generate certificate")
108-
var keyname, certname, p12name string
79+
80+
certFile, keyFile, p12File := m.fileNames(hosts)
81+
10982
if !m.pkcs12 {
11083
privDER, err := x509.MarshalPKCS8PrivateKey(priv)
11184
fatalIfErr(err, "failed to encode certificate key")
112-
keyname, err = m.getFileName("key", hosts)
113-
fatalIfErr(err, "failed to generate key file name")
114-
err = ioutil.WriteFile(keyname, pem.EncodeToMemory(
85+
err = ioutil.WriteFile(keyFile, pem.EncodeToMemory(
11586
&pem.Block{Type: "PRIVATE KEY", Bytes: privDER}), 0600)
11687
fatalIfErr(err, "failed to save certificate key")
11788

118-
certname, err = m.getFileName("cert", hosts)
119-
fatalIfErr(err, "failed to generate cert file name")
120-
err = ioutil.WriteFile(certname, pem.EncodeToMemory(
89+
err = ioutil.WriteFile(certFile, pem.EncodeToMemory(
12190
&pem.Block{Type: "CERTIFICATE", Bytes: cert}), 0644)
12291
fatalIfErr(err, "failed to save certificate key")
12392
} else {
12493
domainCert, _ := x509.ParseCertificate(cert)
12594
pfxData, err := pkcs12.Encode(rand.Reader, priv, domainCert, []*x509.Certificate{m.caCert}, "changeit")
12695
fatalIfErr(err, "failed to generate PKCS#12")
127-
p12name, err = m.getFileName("p12", hosts)
128-
fatalIfErr(err, "failed to generate cert PKCS#12 file name")
129-
err = ioutil.WriteFile(p12name, pfxData, 0644)
96+
err = ioutil.WriteFile(p12File, pfxData, 0644)
13097
fatalIfErr(err, "failed to save PKCS#12")
13198
}
13299

@@ -147,13 +114,36 @@ func (m *mkcert) makeCert(hosts []string) {
147114
}
148115

149116
if !m.pkcs12 {
150-
log.Printf("\nThe certificate is at \"./%s\" and the key at \"./%s\"\n\n", certname, keyname)
117+
log.Printf("\nThe certificate is at \"%s\" and the key at \"%s\"\n\n", certFile, keyFile)
151118
} else {
152-
log.Printf("\nThe PKCS#12 bundle is at \"./%s\"\n", p12name)
119+
log.Printf("\nThe PKCS#12 bundle is at \"%s\"\n", p12File)
153120
log.Printf("\nThe legacy PKCS#12 encryption password is the often hardcoded default \"changeit\" ℹ️\n\n")
154121
}
155122
}
156123

124+
func (m *mkcert) fileNames(hosts []string) (certFile, keyFile, p12File string) {
125+
defaultName := strings.Replace(hosts[0], ":", "_", -1)
126+
defaultName = strings.Replace(defaultName, "*", "_wildcard", -1)
127+
if len(hosts) > 1 {
128+
defaultName += "+" + strconv.Itoa(len(hosts)-1)
129+
}
130+
131+
certFile = "./" + defaultName + ".pem"
132+
if m.certFile != "" {
133+
certFile = m.certFile
134+
}
135+
keyFile = "./" + defaultName + "-key.pem"
136+
if m.keyFile != "" {
137+
keyFile = m.keyFile
138+
}
139+
p12File = "./" + defaultName + ".p12"
140+
if m.p12File != "" {
141+
p12File = m.p12File
142+
}
143+
144+
return
145+
}
146+
157147
// loadCA will load or create the CA at CAROOT.
158148
func (m *mkcert) loadCA() {
159149
if _, err := os.Stat(filepath.Join(m.CAROOT, rootName)); os.IsNotExist(err) {
@@ -171,11 +161,11 @@ func (m *mkcert) loadCA() {
171161
m.caCert, err = x509.ParseCertificate(certDERBlock.Bytes)
172162
fatalIfErr(err, "failed to parse the CA certificate")
173163

174-
if _, err := os.Stat(filepath.Join(m.CAROOT, keyName)); os.IsNotExist(err) {
164+
if _, err := os.Stat(filepath.Join(m.CAROOT, rootKeyName)); os.IsNotExist(err) {
175165
return // keyless mode, where only -install works
176166
}
177167

178-
keyPEMBlock, err := ioutil.ReadFile(filepath.Join(m.CAROOT, keyName))
168+
keyPEMBlock, err := ioutil.ReadFile(filepath.Join(m.CAROOT, rootKeyName))
179169
fatalIfErr(err, "failed to read the CA key")
180170
keyDERBlock, _ := pem.Decode(keyPEMBlock)
181171
if keyDERBlock == nil || keyDERBlock.Type != "PRIVATE KEY" {
@@ -234,7 +224,7 @@ func (m *mkcert) newCA() {
234224

235225
privDER, err := x509.MarshalPKCS8PrivateKey(priv)
236226
fatalIfErr(err, "failed to encode CA key")
237-
err = ioutil.WriteFile(filepath.Join(m.CAROOT, keyName), pem.EncodeToMemory(
227+
err = ioutil.WriteFile(filepath.Join(m.CAROOT, rootKeyName), pem.EncodeToMemory(
238228
&pem.Block{Type: "PRIVATE KEY", Bytes: privDER}), 0400)
239229
fatalIfErr(err, "failed to save CA key")
240230

cert_test.go

Lines changed: 0 additions & 72 deletions
This file was deleted.

main.go

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ const usage = `Usage of mkcert:
4040
$ mkcert -uninstall
4141
Uninstall the local CA (but do not delete it).
4242
43+
Use -cert-file, -key-file and -p12-file to customize the output paths.
44+
4345
Change the CA certificate and key storage location by setting $CAROOT,
4446
print it with "mkcert -CAROOT".
4547
`
@@ -50,10 +52,9 @@ func main() {
5052
var uninstallFlag = flag.Bool("uninstall", false, "uninstall the local root CA from the system trust store")
5153
var pkcs12Flag = flag.Bool("pkcs12", false, "generate PKCS#12 instead of PEM")
5254
var carootFlag = flag.Bool("CAROOT", false, "print the CAROOT path")
53-
// customize file name according to issue#72
54-
var keyFileFlag = flag.String("key-file", "", "customlize your key file name")
55-
var certFileFlag = flag.String("cert-file", "", "customlize your cert file name")
56-
var p12FileFlag = flag.String("p12-file", "", "customlize your p12 file name")
55+
var certFileFlag = flag.String("cert-file", "", "output certificate file path")
56+
var keyFileFlag = flag.String("key-file", "", "output key file path")
57+
var p12FileFlag = flag.String("p12-file", "", "output PKCS#12 file path")
5758
flag.Usage = func() { fmt.Fprintf(flag.CommandLine.Output(), usage) }
5859
flag.Parse()
5960
if *carootFlag {
@@ -68,19 +69,17 @@ func main() {
6869
}
6970
(&mkcert{
7071
installMode: *installFlag, uninstallMode: *uninstallFlag, pkcs12: *pkcs12Flag,
71-
keyFileFlag: *keyFileFlag,
72-
certFileFlag: *certFileFlag,
73-
p12FileFlag: *p12FileFlag,
72+
certFile: *certFileFlag, keyFile: *keyFileFlag, p12File: *p12FileFlag,
7473
}).Run(flag.Args())
7574
}
7675

7776
const rootName = "rootCA.pem"
78-
const keyName = "rootCA-key.pem"
77+
const rootKeyName = "rootCA-key.pem"
7978

8079
type mkcert struct {
81-
installMode, uninstallMode bool
82-
pkcs12 bool
83-
keyFileFlag, certFileFlag, p12FileFlag string
80+
installMode, uninstallMode bool
81+
pkcs12 bool
82+
keyFile, certFile, p12File string
8483

8584
CAROOT string
8685
caCert *x509.Certificate

0 commit comments

Comments
 (0)