@@ -8,11 +8,13 @@ import (
8
8
"crypto/x509"
9
9
"encoding/pem"
10
10
"fmt"
11
- "io/ioutil"
12
11
"log"
13
12
"os"
14
13
"path/filepath"
15
14
"regexp"
15
+ "slices"
16
+ "strings"
17
+ "time"
16
18
)
17
19
18
20
type certPair struct {
@@ -25,7 +27,7 @@ type certPair struct {
25
27
26
28
func getCertsFromNetwork (addr string ) ([]* x509.Certificate , error ) {
27
29
conf := & tls.Config {
28
- InsecureSkipVerify : true ,
30
+ InsecureSkipVerify : false ,
29
31
}
30
32
conn , err := tls .Dial ("tcp" , addr , conf )
31
33
if err != nil {
@@ -35,20 +37,14 @@ func getCertsFromNetwork(addr string) ([]*x509.Certificate, error) {
35
37
return conn .ConnectionState ().PeerCertificates , nil
36
38
}
37
39
38
- func reverse (s []* certPair ) {
39
- for i , j := 0 , len (s )- 1 ; i < j ; i , j = i + 1 , j - 1 {
40
- s [i ], s [j ] = s [j ], s [i ]
41
- }
42
- }
43
-
44
40
func makeCerts (originCerts []* x509.Certificate ) ([]* certPair , error ) {
45
41
certs := make ([]* certPair , len (originCerts ))
46
42
// the origin order: website cert, intermediate ca, root ca
47
43
for idx , cert := range originCerts {
48
44
log .Printf ("got cert: %s" , cert .Subject .CommonName )
49
45
certs [idx ] = & certPair {originCert : cert }
50
46
}
51
- reverse (certs )
47
+ slices . Reverse (certs )
52
48
53
49
for idx , pair := range certs {
54
50
var pub interface {}
@@ -120,23 +116,31 @@ func main() {
120
116
if err != nil {
121
117
log .Fatal (err )
122
118
}
123
- reverse (newCerts )
119
+ slices .Reverse (newCerts )
120
+
121
+ dir := filepath .Join ("certs" , time .Now ().Local ().Format ("2006_01_02_15_04_05" ))
122
+ err = os .MkdirAll (dir , 0o744 )
123
+ if err != nil {
124
+ log .Fatal (err )
125
+ }
124
126
125
- bundleCert , err := os .OpenFile ("bundle.crt" , os .O_WRONLY | os .O_CREATE , 0o744 )
127
+ bundleCert , err := os .OpenFile (filepath . Join ( dir , "bundle.crt" ) , os .O_WRONLY | os .O_CREATE , 0o744 )
126
128
if err != nil {
127
129
log .Fatal (err )
128
130
}
129
131
defer bundleCert .Close ()
130
- bundleKey , err := os .OpenFile ("bundle.key" , os .O_WRONLY | os .O_CREATE , 0o744 )
132
+ bundleKey , err := os .OpenFile (filepath . Join ( dir , "bundle.key" ) , os .O_WRONLY | os .O_CREATE , 0o744 )
131
133
if err != nil {
132
134
log .Fatal (err )
133
135
}
134
136
defer bundleKey .Close ()
135
137
136
138
for _ , pair := range newCerts {
137
139
log .Printf ("going to write new cert and key: %s" , pair .newCert .Subject .CommonName )
138
- pathBase := fileNameRegex .ReplaceAllString (pair .newCert .Subject .CommonName , "_" )
139
- err = ioutil .WriteFile (pathBase + ".crt" , pair .newCertPem , 0o744 )
140
+ // 担心星号在 Windows 上是不合法的文件名(当然我也没测试),但是被替换为下换线又很奇怪,所以替换成 __wildcard__
141
+ pathBase := strings .ReplaceAll (pair .newCert .Subject .CommonName , "*" , "__wildcard__" )
142
+ pathBase = fileNameRegex .ReplaceAllString (pathBase , "_" )
143
+ err = os .WriteFile (filepath .Join (dir , pathBase + ".crt" ), pair .newCertPem , 0o744 )
140
144
if err != nil {
141
145
log .Fatal (err )
142
146
}
@@ -145,7 +149,7 @@ func main() {
145
149
log .Fatal (err )
146
150
}
147
151
148
- err = ioutil .WriteFile (pathBase + ".key" , pair .privPem , 0o744 )
152
+ err = os .WriteFile (filepath . Join ( dir , pathBase + ".key" ) , pair .privPem , 0o744 )
149
153
if err != nil {
150
154
log .Fatal (err )
151
155
}
@@ -154,4 +158,5 @@ func main() {
154
158
log .Fatal (err )
155
159
}
156
160
}
161
+ log .Printf ("certs save to %s" , dir )
157
162
}
0 commit comments