@@ -10,7 +10,7 @@ use base64::{engine::general_purpose::STANDARD, Engine};
1010use chrono:: Utc ;
1111use log:: { error, info} ;
1212use prost:: Message ;
13- use reqwest:: { header:: HeaderMap , Certificate , ClientBuilder } ;
13+ use reqwest:: { header:: HeaderMap , Certificate , Client , ClientBuilder } ;
1414use serde:: { Deserialize , Serialize } ;
1515use serde_json:: Value ;
1616use sha2:: { Digest , Sha256 } ;
@@ -53,27 +53,65 @@ impl ClientKeyClient {
5353 Ok ( kms_instance_ca_cert)
5454 }
5555
56+ fn build_http_client ( cert_pem : Option < & str > , insecure_skip_tls_verify : bool ) -> Result < Client > {
57+ let mut builder = ClientBuilder :: new ( ) . use_rustls_tls ( ) ;
58+
59+ if let Some ( cert_pem) = cert_pem. filter ( |v| !v. is_empty ( ) ) {
60+ let cert = Self :: read_kms_instance_cert ( cert_pem. as_bytes ( ) ) ?;
61+ builder = builder. add_root_certificate ( cert) ;
62+ } else if !insecure_skip_tls_verify {
63+ return Err ( Error :: AliyunKmsError (
64+ "kms instance ca cert is required unless insecure_skip_tls_verify is enabled"
65+ . to_string ( ) ,
66+ ) ) ;
67+ }
68+
69+ if insecure_skip_tls_verify {
70+ builder = builder. danger_accept_invalid_certs ( true ) ;
71+ }
72+
73+ builder
74+ . build ( )
75+ . map_err ( |e| Error :: AliyunKmsError ( format ! ( "build http client failed: {e:?}" ) ) )
76+ }
77+
5678 pub fn new (
5779 client_key : & str ,
5880 kms_instance_id : & str ,
5981 password : & str ,
6082 cert_pem : & str ,
83+ ) -> Result < Self > {
84+ Self :: new_with_options (
85+ client_key,
86+ kms_instance_id,
87+ password,
88+ Some ( cert_pem) ,
89+ None ,
90+ false ,
91+ )
92+ }
93+
94+ pub fn new_with_options (
95+ client_key : & str ,
96+ kms_instance_id : & str ,
97+ password : & str ,
98+ cert_pem : Option < & str > ,
99+ endpoint : Option < & str > ,
100+ insecure_skip_tls_verify : bool ,
61101 ) -> Result < Self > {
62102 let credential = CredentialClientKey :: new ( client_key, password) . map_err ( |e| {
63103 Error :: AliyunKmsError ( format ! (
64104 "create client_key credential of the kms instance failed: {e:?}"
65105 ) )
66106 } ) ?;
67107
68- let endpoint = format ! ( "{kms_instance_id}.cryptoservice.kms.aliyuncs.com" ) ;
108+ let endpoint = endpoint
109+ . filter ( |v| !v. is_empty ( ) )
110+ . map ( ToOwned :: to_owned)
111+ . unwrap_or_else ( || format ! ( "{kms_instance_id}.cryptoservice.kms.aliyuncs.com" ) ) ;
69112 let config = ConfigClientKey :: new ( kms_instance_id, & endpoint) ;
70113
71- let cert = Self :: read_kms_instance_cert ( cert_pem. as_bytes ( ) ) ?;
72- let http_client = ClientBuilder :: new ( )
73- . use_rustls_tls ( )
74- . add_root_certificate ( cert)
75- . build ( )
76- . map_err ( |e| Error :: AliyunKmsError ( format ! ( "build http client failed: {e:?}" ) ) ) ?;
114+ let http_client = Self :: build_http_client ( cert_pem, insecure_skip_tls_verify) ?;
77115
78116 Ok ( Self {
79117 credential,
0 commit comments