upgrade to native-tls 0.2 + invalid certs (#325)
- Bumps `native-tls` dependency to 0.2 and adapt code accordingly - Import code used from `tokio-tls` into `connect_async` and adapt dependencies accordinlgy - Add an option for using `danger_accept_invalid_certs` inside the `Config` struct
This commit is contained in:
committed by
Sean McArthur
parent
a25f62f4cb
commit
11f8588989
@@ -45,6 +45,7 @@ struct Config {
|
||||
gzip: bool,
|
||||
headers: HeaderMap,
|
||||
hostname_verification: bool,
|
||||
certs_verification: bool,
|
||||
proxies: Vec<Proxy>,
|
||||
redirect_policy: RedirectPolicy,
|
||||
referer: bool,
|
||||
@@ -56,31 +57,24 @@ struct Config {
|
||||
impl ClientBuilder {
|
||||
/// Constructs a new `ClientBuilder`
|
||||
pub fn new() -> ClientBuilder {
|
||||
match TlsConnector::builder() {
|
||||
Ok(tls_connector_builder) => {
|
||||
let mut headers: HeaderMap<HeaderValue> = HeaderMap::with_capacity(2);
|
||||
headers.insert(USER_AGENT, HeaderValue::from_static(DEFAULT_USER_AGENT));
|
||||
headers.insert(ACCEPT, HeaderValue::from_str(mime::STAR_STAR.as_ref()).expect("unable to parse mime"));
|
||||
let mut headers: HeaderMap<HeaderValue> = HeaderMap::with_capacity(2);
|
||||
headers.insert(USER_AGENT, HeaderValue::from_static(DEFAULT_USER_AGENT));
|
||||
headers.insert(ACCEPT, HeaderValue::from_str(mime::STAR_STAR.as_ref()).expect("unable to parse mime"));
|
||||
|
||||
ClientBuilder {
|
||||
config: Some(Config {
|
||||
gzip: true,
|
||||
headers: headers,
|
||||
hostname_verification: true,
|
||||
proxies: Vec::new(),
|
||||
redirect_policy: RedirectPolicy::default(),
|
||||
referer: true,
|
||||
timeout: None,
|
||||
tls: tls_connector_builder,
|
||||
dns_threads: 4,
|
||||
}),
|
||||
err: None,
|
||||
}
|
||||
},
|
||||
Err(e) => ClientBuilder {
|
||||
config: None,
|
||||
err: Some(::error::from(e)),
|
||||
}
|
||||
ClientBuilder {
|
||||
config: Some(Config {
|
||||
gzip: true,
|
||||
headers: headers,
|
||||
hostname_verification: true,
|
||||
certs_verification: true,
|
||||
proxies: Vec::new(),
|
||||
redirect_policy: RedirectPolicy::default(),
|
||||
referer: true,
|
||||
timeout: None,
|
||||
tls: TlsConnector::builder(),
|
||||
dns_threads: 4,
|
||||
}),
|
||||
err: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,19 +92,19 @@ impl ClientBuilder {
|
||||
if let Some(err) = self.err.take() {
|
||||
return Err(err);
|
||||
}
|
||||
let config = self.config
|
||||
let mut config = self.config
|
||||
.take()
|
||||
.expect("ClientBuilder cannot be reused after building a Client");
|
||||
|
||||
config.tls.danger_accept_invalid_hostnames(!config.hostname_verification);
|
||||
config.tls.danger_accept_invalid_certs(!config.certs_verification);
|
||||
|
||||
let tls = try_!(config.tls.build());
|
||||
|
||||
let proxies = Arc::new(config.proxies);
|
||||
|
||||
let mut connector = Connector::new(config.dns_threads, tls, proxies.clone());
|
||||
if !config.hostname_verification {
|
||||
connector.danger_disable_hostname_verification();
|
||||
}
|
||||
|
||||
|
||||
let hyper_client = ::hyper::Client::builder()
|
||||
.build(connector);
|
||||
|
||||
@@ -133,9 +127,7 @@ impl ClientBuilder {
|
||||
pub fn add_root_certificate(&mut self, cert: Certificate) -> &mut ClientBuilder {
|
||||
if let Some(config) = config_mut(&mut self.config, &self.err) {
|
||||
let cert = ::tls::cert(cert);
|
||||
if let Err(e) = config.tls.add_root_certificate(cert) {
|
||||
self.err = Some(::error::from(e));
|
||||
}
|
||||
config.tls.add_root_certificate(cert);
|
||||
}
|
||||
self
|
||||
}
|
||||
@@ -144,9 +136,7 @@ impl ClientBuilder {
|
||||
pub fn identity(&mut self, identity: Identity) -> &mut ClientBuilder {
|
||||
if let Some(config) = config_mut(&mut self.config, &self.err) {
|
||||
let pkcs12 = ::tls::pkcs12(identity);
|
||||
if let Err(e) = config.tls.identity(pkcs12) {
|
||||
self.err = Some(::error::from(e));
|
||||
}
|
||||
config.tls.identity(pkcs12);
|
||||
}
|
||||
self
|
||||
}
|
||||
@@ -177,6 +167,31 @@ impl ClientBuilder {
|
||||
self
|
||||
}
|
||||
|
||||
/// Disable certs verification.
|
||||
///
|
||||
/// # Warning
|
||||
///
|
||||
/// You should think very carefully before you use this method. If
|
||||
/// hostname verification is not used, any valid certificate for any
|
||||
/// site will be trusted for use from any other. This introduces a
|
||||
/// significant vulnerability to man-in-the-middle attacks.
|
||||
#[inline]
|
||||
pub fn danger_disable_certs_verification(&mut self) -> &mut ClientBuilder {
|
||||
if let Some(config) = config_mut(&mut self.config, &self.err) {
|
||||
config.certs_verification = false;
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
/// Enable certs verification.
|
||||
#[inline]
|
||||
pub fn enable_certs_verification(&mut self) -> &mut ClientBuilder {
|
||||
if let Some(config) = config_mut(&mut self.config, &self.err) {
|
||||
config.certs_verification = true;
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
/// Sets the default headers for every request.
|
||||
#[inline]
|
||||
pub fn default_headers(&mut self, headers: HeaderMap) -> &mut ClientBuilder {
|
||||
|
||||
Reference in New Issue
Block a user