@@ -3,8 +3,12 @@ package main
3
3
import (
4
4
"crypto/tls"
5
5
"errors"
6
+ "io/ioutil"
6
7
"log"
7
8
"net/http"
9
+ "os"
10
+ "path/filepath"
11
+ "strconv"
8
12
"strings"
9
13
"time"
10
14
@@ -64,21 +68,75 @@ func Server(ll []string) (*http.Server, error) {
64
68
})
65
69
n .UseHandler (nico )
66
70
67
- m := autocert.Manager {
68
- Cache : autocert .DirCache (".letsencrypt" ),
69
- Prompt : autocert .AcceptTOS ,
70
- HostPolicy : autocert .HostWhitelist (nico .Domains ()... ),
71
-
71
+ certs := make (map [string ]* tls.Certificate )
72
+ auto := make ([]string , 0 )
73
+ for _ , v := range nico .Domains () {
74
+ c , err := ioutil .ReadFile (filepath .Join (certpath , v + ".cert.pem" ))
75
+ if err != nil && ! os .IsNotExist (err ) {
76
+ return nil , err
77
+ }
78
+ k , err := ioutil .ReadFile (filepath .Join (certpath , v + ".key.pem" ))
79
+ if err != nil && ! os .IsNotExist (err ) {
80
+ return nil , err
81
+ }
82
+ if c != nil && k != nil {
83
+ ct , err := tls .X509KeyPair (c , k )
84
+ if err != nil {
85
+ return nil , err
86
+ }
87
+ certs [v ] = & ct
88
+ continue
89
+ }
90
+ if strings .Index (v , "." ) != - 1 {
91
+ c , err := ioutil .ReadFile (filepath .Join (certpath , v [strings .Index (v , "." ):]+ ".cert.pem" ))
92
+ if err != nil && ! os .IsNotExist (err ) {
93
+ return nil , err
94
+ }
95
+ k , err := ioutil .ReadFile (filepath .Join (certpath , v [strings .Index (v , "." ):]+ ".key.pem" ))
96
+ if err != nil && ! os .IsNotExist (err ) {
97
+ return nil , err
98
+ }
99
+ if c != nil && k != nil {
100
+ ct , err := tls .X509KeyPair (c , k )
101
+ if err != nil {
102
+ return nil , err
103
+ }
104
+ certs [v ] = & ct
105
+ continue
106
+ }
107
+ }
108
+ auto = append (auto , v )
109
+ }
110
+
111
+ var m autocert.Manager
112
+ if len (auto ) != 0 {
113
+ m = autocert.Manager {
114
+ Cache : autocert .DirCache (".letsencrypt" ),
115
+ Prompt : autocert .AcceptTOS ,
116
+ HostPolicy : autocert .HostWhitelist (auto ... ),
117
+
118
+ }
119
+ go http .ListenAndServe (":80" , m .HTTPHandler (nil ))
72
120
}
73
- go http .ListenAndServe (":80" , m .HTTPHandler (nil ))
74
121
return & http.Server {
75
- Addr : ":443" ,
122
+ Addr : ":" + strconv . FormatInt ( port , 10 ) ,
76
123
ReadTimeout : time .Duration (timeout ) * time .Second ,
77
124
WriteTimeout : time .Duration (timeout ) * time .Second ,
78
125
IdleTimeout : time .Duration (timeout ) * time .Second ,
79
126
MaxHeaderBytes : 1 << 20 ,
80
127
Handler : n ,
81
128
ErrorLog : log .New (& tlserr {}, "" , log .LstdFlags ),
82
- TLSConfig : & tls.Config {GetCertificate : m .GetCertificate },
129
+ TLSConfig : & tls.Config {
130
+ GetCertificate : func (c * tls.ClientHelloInfo ) (* tls.Certificate , error ) {
131
+ v , ok := certs [c .ServerName ]
132
+ if ok {
133
+ return v , nil
134
+ }
135
+ if len (auto ) != 0 {
136
+ return m .GetCertificate (c )
137
+ }
138
+ return nil , errors .New ("Not found " + c .ServerName )
139
+ },
140
+ },
83
141
}, nil
84
142
}
0 commit comments