Skip to content

Commit e458986

Browse files
committed
add start end time
1 parent ca29587 commit e458986

File tree

3 files changed

+109
-34
lines changed

3 files changed

+109
-34
lines changed

ca.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@ type Ca struct {
1919
KeyPEM []byte
2020
}
2121

22-
func NewCa(Organization, OrganizationalUnit, CommonName string) *Ca {
22+
func NewCa(Organization, OrganizationalUnit, CommonName string, start, end time.Time) *Ca {
2323
var l []string
24+
if Organization != "" {
25+
l = []string{Organization}
26+
}
27+
var l1 []string
2428
if OrganizationalUnit != "" {
25-
l = []string{OrganizationalUnit}
29+
l1 = []string{OrganizationalUnit}
2630
}
2731
c := &x509.Certificate{
2832
Subject: pkix.Name{
29-
Organization: []string{Organization},
30-
OrganizationalUnit: l,
33+
Organization: l,
34+
OrganizationalUnit: l1,
3135
CommonName: CommonName,
3236
},
33-
NotBefore: time.Now(),
34-
NotAfter: time.Now().AddDate(10, 0, 0),
37+
NotBefore: start,
38+
NotAfter: end,
3539
IsCA: true,
3640
KeyUsage: x509.KeyUsageCertSign,
3741
BasicConstraintsValid: true,

cert.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,22 @@ type Cert struct {
2323
KeyPEM []byte
2424
}
2525

26-
func NewCert(caPEM, caKeyPEM []byte, Organization, OrganizationalUnit string) *Cert {
26+
func NewCert(caPEM, caKeyPEM []byte, Organization, OrganizationalUnit string, start, end time.Time) *Cert {
2727
var l []string
28+
if Organization != "" {
29+
l = []string{Organization}
30+
}
31+
var l1 []string
2832
if OrganizationalUnit != "" {
29-
l = []string{OrganizationalUnit}
33+
l1 = []string{OrganizationalUnit}
3034
}
3135
c := &x509.Certificate{
3236
Subject: pkix.Name{
33-
Organization: []string{Organization},
34-
OrganizationalUnit: l,
37+
Organization: l,
38+
OrganizationalUnit: l1,
3539
},
36-
NotBefore: time.Date(2019, time.June, 1, 0, 0, 0, 0, time.UTC),
37-
NotAfter: time.Now().AddDate(10, 0, 0),
40+
NotBefore: start,
41+
NotAfter: end,
3842
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},
3943
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
4044
BasicConstraintsValid: true,
@@ -48,16 +52,16 @@ func NewCert(caPEM, caKeyPEM []byte, Organization, OrganizationalUnit string) *C
4852

4953
func (c *Cert) SetIPAddresses(ips []net.IP) {
5054
c.C.IPAddresses = ips
51-
if len(ips) > 0 {
52-
c.C.Subject.CommonName = ips[0].String()
53-
}
55+
c.C.Subject.CommonName = ips[0].String()
5456
}
5557

5658
func (c *Cert) SetDNSNames(domains []string) {
5759
c.C.DNSNames = domains
58-
if len(domains) > 0 {
59-
c.C.Subject.CommonName = domains[0]
60-
}
60+
c.C.Subject.CommonName = domains[0]
61+
}
62+
63+
func (c *Cert) SetCommonName(commonName string) {
64+
c.C.Subject.CommonName = commonName
6165
}
6266

6367
func (c *Cert) Create() error {

cli/mad/main.go

Lines changed: 83 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@ package main
22

33
import (
44
"errors"
5-
"io/ioutil"
65
"log"
76
"net"
8-
_ "net/http/pprof"
97
"os"
8+
"time"
109

1110
"github.com/txthinking/mad"
1211
"github.com/urfave/cli/v2"
1312
)
1413

1514
func main() {
1615
app := cli.NewApp()
17-
app.Name = "Mad"
18-
app.Version = "20240428"
16+
app.Name = "mad"
17+
app.Version = "20240923"
1918
app.Usage = "Generate root CA and derivative certificate for any domains and any IPs"
2019
app.Authors = []*cli.Author{
2120
{
@@ -36,7 +35,7 @@ func main() {
3635
&cli.StringFlag{
3736
Name: "key",
3837
Usage: "Key file which will be created or overwritten",
39-
Value: "ca_key.pem",
38+
Value: "ca.key.pem",
4039
},
4140
&cli.StringFlag{
4241
Name: "organization",
@@ -50,13 +49,36 @@ func main() {
5049
Name: "commonName",
5150
Value: "github.com/txthinking/mad",
5251
},
52+
&cli.StringFlag{
53+
Name: "start",
54+
Usage: "Certificate valid start time, such as: '2024-09-22T13:07:38+08:00'. If empty, it is the current time",
55+
},
56+
&cli.StringFlag{
57+
Name: "end",
58+
Usage: "Certificate valid end time, such as: '2024-09-22T13:07:38+08:00'. If empty, it is start time add 10 years",
59+
},
5360
&cli.BoolFlag{
5461
Name: "install",
55-
Usage: "Install CA",
62+
Usage: "Install immediately after creation",
5663
},
5764
},
5865
Action: func(c *cli.Context) error {
59-
ca := mad.NewCa(c.String("organization"), c.String("organizationUnit"), c.String("commonName"))
66+
var err error
67+
start := time.Now()
68+
if c.String("start") != "" {
69+
start, err = time.Parse(time.RFC3339, c.String("start"))
70+
if err != nil {
71+
return err
72+
}
73+
}
74+
end := start.AddDate(10, 0, 0)
75+
if c.String("end") != "" {
76+
end, err = time.Parse(time.RFC3339, c.String("end"))
77+
if err != nil {
78+
return err
79+
}
80+
}
81+
ca := mad.NewCa(c.String("organization"), c.String("organizationUnit"), c.String("commonName"), start, end)
6082
if err := ca.Create(); err != nil {
6183
return err
6284
}
@@ -82,8 +104,12 @@ func main() {
82104
},
83105
&cli.StringFlag{
84106
Name: "ca_key",
107+
Usage: "Deprecated, please use --caKey",
108+
},
109+
&cli.StringFlag{
110+
Name: "caKey",
85111
Usage: "ROOT Key file path",
86-
Value: "ca_key.pem",
112+
Value: "ca.key.pem",
87113
},
88114
&cli.StringFlag{
89115
Name: "cert",
@@ -93,7 +119,7 @@ func main() {
93119
&cli.StringFlag{
94120
Name: "key",
95121
Usage: "Certificate key file which will be created or overwritten",
96-
Value: "cert_key.pem",
122+
Value: "cert.key.pem",
97123
},
98124
&cli.StringFlag{
99125
Name: "organization",
@@ -111,17 +137,51 @@ func main() {
111137
Name: "domain",
112138
Usage: "Domain name",
113139
},
140+
&cli.StringFlag{
141+
Name: "commonName",
142+
Usage: "If empty, the first domain or IP will be used",
143+
},
144+
&cli.StringFlag{
145+
Name: "start",
146+
Usage: "Certificate valid start time, such as: '2024-09-22T13:07:38+08:00'. If empty, it is the current time",
147+
},
148+
&cli.StringFlag{
149+
Name: "end",
150+
Usage: "Certificate valid end time, such as: '2024-09-22T13:07:38+08:00'. If empty, it is start time add 10 years",
151+
},
114152
},
115153
Action: func(c *cli.Context) error {
116-
ca, err := ioutil.ReadFile(c.String("ca"))
154+
ca, err := os.ReadFile(c.String("ca"))
117155
if err != nil {
118156
return err
119157
}
120-
caKey, err := ioutil.ReadFile(c.String("ca_key"))
121-
if err != nil {
122-
return err
158+
var caKey []byte
159+
if c.String("ca_key") != "" {
160+
caKey, err = os.ReadFile(c.String("ca_key"))
161+
if err != nil {
162+
return err
163+
}
164+
} else {
165+
caKey, err = os.ReadFile(c.String("caKey"))
166+
if err != nil {
167+
return err
168+
}
123169
}
124-
cert := mad.NewCert(ca, caKey, c.String("organization"), c.String("organizationUnit"))
170+
start := time.Now()
171+
if c.String("start") != "" {
172+
start, err = time.Parse(time.RFC3339, c.String("start"))
173+
if err != nil {
174+
return err
175+
}
176+
}
177+
end := start.AddDate(10, 0, 0)
178+
if c.String("end") != "" {
179+
end, err = time.Parse(time.RFC3339, c.String("end"))
180+
if err != nil {
181+
return err
182+
}
183+
}
184+
cert := mad.NewCert(ca, caKey, c.String("organization"), c.String("organizationUnit"), start, end)
125185
ips := make([]net.IP, 0)
126186
for _, v := range c.StringSlice("ip") {
127187
ip := net.ParseIP(v)
@@ -130,8 +190,15 @@ func main() {
130190
}
131191
ips = append(ips, ip)
132192
}
133-
cert.SetIPAddresses(ips)
134-
cert.SetDNSNames(c.StringSlice("domain"))
193+
if len(ips) > 0 {
194+
cert.SetIPAddresses(ips)
195+
}
196+
if len(c.StringSlice("domain")) > 0 {
197+
cert.SetDNSNames(c.StringSlice("domain"))
198+
}
199+
if c.String("commonName") != "" {
200+
cert.SetCommonName(c.String("commonName"))
201+
}
135202
if err := cert.Create(); err != nil {
136203
return err
137204
}

0 commit comments

Comments
 (0)