@@ -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-
7142func (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 ("\n The certificate is at \" ./ %s\" and the key at \" ./ %s\" ✅\n \n " , certname , keyname )
117+ log .Printf ("\n The certificate is at \" %s\" and the key at \" %s\" ✅\n \n " , certFile , keyFile )
151118 } else {
152- log .Printf ("\n The PKCS#12 bundle is at \" ./ %s\" ✅\n " , p12name )
119+ log .Printf ("\n The PKCS#12 bundle is at \" %s\" ✅\n " , p12File )
153120 log .Printf ("\n The 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.
158148func (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
0 commit comments