@@ -22,7 +22,8 @@ use async_trait::async_trait;
22
22
use base64:: { engine:: general_purpose:: STANDARD , Engine } ;
23
23
use http:: StatusCode ;
24
24
use instant_acme:: {
25
- Account , ChallengeType , Identifier , LetsEncrypt , NewAccount , NewOrder , OrderStatus ,
25
+ Account , ChallengeType , Identifier , LetsEncrypt , NewAccount , NewOrder ,
26
+ OrderStatus ,
26
27
} ;
27
28
use once_cell:: sync:: OnceCell ;
28
29
use pingora:: proxy:: Session ;
@@ -71,11 +72,12 @@ pub fn new_lets_encrypt_service(
71
72
impl ServiceTask for LetsEncryptService {
72
73
async fn run ( & self ) -> Option < bool > {
73
74
let domains = & self . domains ;
74
- let should_renew_now = if let Ok ( cert) = get_lets_encrypt_cert ( & self . certificate_file ) {
75
- !cert. valid ( ) || domains. join ( "," ) != cert. domains . join ( "," )
76
- } else {
77
- true
78
- } ;
75
+ let should_renew_now =
76
+ if let Ok ( cert) = get_lets_encrypt_cert ( & self . certificate_file ) {
77
+ !cert. valid ( ) || domains. join ( "," ) != cert. domains . join ( "," )
78
+ } else {
79
+ true
80
+ } ;
79
81
if should_renew_now {
80
82
info ! ( domains = domains. join( "," ) , "renew cert from let's encrypt" ) ;
81
83
match new_lets_encrypt ( & self . certificate_file , domains) . await {
@@ -88,7 +90,7 @@ impl ServiceTask for LetsEncryptService {
88
90
"restart fail"
89
91
) ;
90
92
}
91
- }
93
+ } ,
92
94
Err ( e) => error ! (
93
95
error = e. to_string( ) ,
94
96
domains = domains. join( "," ) ,
@@ -111,20 +113,23 @@ pub fn get_lets_encrypt_cert(path: &PathBuf) -> Result<Certificate> {
111
113
} ) ;
112
114
}
113
115
let buf = std:: fs:: read ( path) . map_err ( |e| Error :: Io { source : e } ) ?;
114
- let cert: Certificate =
115
- serde_json :: from_slice ( & buf ) . map_err ( |e| Error :: SerdeJson { source : e } ) ?;
116
+ let cert: Certificate = serde_json :: from_slice ( & buf )
117
+ . map_err ( |e| Error :: SerdeJson { source : e } ) ?;
116
118
Ok ( cert)
117
119
}
118
120
119
121
/// The proxy plugin for lets encrypt http-01.
120
- pub async fn handle_lets_encrypt ( session : & mut Session , ctx : & mut State ) -> pingora:: Result < bool > {
122
+ pub async fn handle_lets_encrypt (
123
+ session : & mut Session ,
124
+ ctx : & mut State ,
125
+ ) -> pingora:: Result < bool > {
121
126
let path = session. req_header ( ) . uri . path ( ) ;
122
127
if path. starts_with ( "/.well-known/acme-challenge/" ) {
123
128
let value = {
124
129
let data = get_lets_encrypt ( ) . lock ( ) . await ;
125
- let v = data
126
- . get ( path )
127
- . ok_or_else ( || util :: new_internal_error ( 400 , "token not found" . to_string ( ) ) ) ?;
130
+ let v = data. get ( path ) . ok_or_else ( || {
131
+ util :: new_internal_error ( 400 , "token not found" . to_string ( ) )
132
+ } ) ?;
128
133
v. clone ( )
129
134
} ;
130
135
ctx. response_body_size = HttpResponse {
@@ -141,7 +146,10 @@ pub async fn handle_lets_encrypt(session: &mut Session, ctx: &mut State) -> ping
141
146
142
147
/// Get the new cert from lets encrypt for all domains.
143
148
/// The cert will be saved if success.
144
- async fn new_lets_encrypt ( certificate_file : & PathBuf , domains : & [ String ] ) -> Result < ( ) > {
149
+ async fn new_lets_encrypt (
150
+ certificate_file : & PathBuf ,
151
+ domains : & [ String ] ,
152
+ ) -> Result < ( ) > {
145
153
let mut domains: Vec < String > = domains. to_vec ( ) ;
146
154
domains. sort ( ) ;
147
155
info ! ( domains = domains. join( "," ) , "acme form let's encrypt" ) ;
@@ -187,7 +195,7 @@ async fn new_lets_encrypt(certificate_file: &PathBuf, domains: &[String]) -> Res
187
195
"acme from let's encrypt"
188
196
) ;
189
197
match authz. status {
190
- instant_acme:: AuthorizationStatus :: Pending => { }
198
+ instant_acme:: AuthorizationStatus :: Pending => { } ,
191
199
instant_acme:: AuthorizationStatus :: Valid => continue ,
192
200
_ => todo ! ( ) ,
193
201
}
@@ -205,7 +213,8 @@ async fn new_lets_encrypt(certificate_file: &PathBuf, domains: &[String]) -> Res
205
213
let key_auth = order. key_authorization ( challenge) ;
206
214
207
215
// http://<你的域名>/.well-known/acme-challenge/<TOKEN>
208
- let well_known_path = format ! ( "/.well-known/acme-challenge/{}" , challenge. token) ;
216
+ let well_known_path =
217
+ format ! ( "/.well-known/acme-challenge/{}" , challenge. token) ;
209
218
info ! ( well_known_path, "let's encrypt well known path" , ) ;
210
219
211
220
let mut map = get_lets_encrypt ( ) . lock ( ) . await ;
@@ -228,7 +237,9 @@ async fn new_lets_encrypt(certificate_file: &PathBuf, domains: &[String]) -> Res
228
237
let state = loop {
229
238
let state = order. state ( ) ;
230
239
info ! ( status = format!( "{:?}" , state. status) , "get order status" ) ;
231
- if let OrderStatus :: Ready | OrderStatus :: Invalid | OrderStatus :: Valid = state. status {
240
+ if let OrderStatus :: Ready | OrderStatus :: Invalid | OrderStatus :: Valid =
241
+ state. status
242
+ {
232
243
break state;
233
244
}
234
245
order
@@ -239,14 +250,15 @@ async fn new_lets_encrypt(certificate_file: &PathBuf, domains: &[String]) -> Res
239
250
delay *= 2 ;
240
251
tries += 1 ;
241
252
match tries < 10 {
242
- true => info ! ( delay = format!( "{delay:?}" ) , "Order is not ready, waiting" ) ,
253
+ true => info ! (
254
+ delay = format!( "{delay:?}" ) ,
255
+ "Order is not ready, waiting"
256
+ ) ,
243
257
false => {
244
258
return Err ( Error :: Fail {
245
- message : format ! (
246
- "Giving up: order is not ready. For details, see the url: {detail_url:?}"
247
- ) ,
259
+ message : format ! ( "Giving up: order is not ready. For details, see the url: {detail_url:?}" ) ,
248
260
} ) ;
249
- }
261
+ } ,
250
262
}
251
263
tokio:: time:: sleep ( delay) . await ;
252
264
} ;
@@ -262,7 +274,8 @@ async fn new_lets_encrypt(certificate_file: &PathBuf, domains: &[String]) -> Res
262
274
263
275
let mut params = CertificateParams :: new ( names. clone ( ) ) ;
264
276
params. distinguished_name = DistinguishedName :: new ( ) ;
265
- let cert = rcgen:: Certificate :: from_params ( params) . map_err ( |e| Error :: Rcgen { source : e } ) ?;
277
+ let cert = rcgen:: Certificate :: from_params ( params)
278
+ . map_err ( |e| Error :: Rcgen { source : e } ) ?;
266
279
let csr = cert
267
280
. serialize_request_der ( )
268
281
. map_err ( |e| Error :: Rcgen { source : e } ) ?;
@@ -304,7 +317,8 @@ async fn new_lets_encrypt(certificate_file: &PathBuf, domains: &[String]) -> Res
304
317
pem : STANDARD . encode ( cert_chain_pem. as_bytes ( ) ) ,
305
318
key : STANDARD . encode ( cert. serialize_private_key_pem ( ) . as_bytes ( ) ) ,
306
319
} ;
307
- let buf = serde_json:: to_vec ( & info) . map_err ( |e| Error :: SerdeJson { source : e } ) ?;
320
+ let buf = serde_json:: to_vec ( & info)
321
+ . map_err ( |e| Error :: SerdeJson { source : e } ) ?;
308
322
f. write ( & buf) . await . map_err ( |e| Error :: Io { source : e } ) ?;
309
323
info ! (
310
324
certificate_file = format!( "{certificate_file:?}" ) ,
0 commit comments