feat(ssl): enable hostname verification by default for OpenSSL
Additionally disables SSLv2 and SSLv3, as those are universally considered unsafe. Closes #472
This commit is contained in:
@@ -32,6 +32,10 @@ default-features = false
|
|||||||
version = "0.7"
|
version = "0.7"
|
||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
|
[dependencies.openssl-verify]
|
||||||
|
version = "0.1"
|
||||||
|
optional = true
|
||||||
|
|
||||||
[dependencies.security-framework]
|
[dependencies.security-framework]
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
optional = true
|
optional = true
|
||||||
@@ -49,6 +53,6 @@ env_logger = "0.3"
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["ssl"]
|
default = ["ssl"]
|
||||||
ssl = ["openssl", "cookie/secure"]
|
ssl = ["openssl", "openssl-verify", "cookie/secure"]
|
||||||
serde-serialization = ["serde", "mime/serde"]
|
serde-serialization = ["serde", "mime/serde"]
|
||||||
nightly = []
|
nightly = []
|
||||||
|
|||||||
@@ -133,6 +133,8 @@ extern crate time;
|
|||||||
#[macro_use] extern crate url;
|
#[macro_use] extern crate url;
|
||||||
#[cfg(feature = "openssl")]
|
#[cfg(feature = "openssl")]
|
||||||
extern crate openssl;
|
extern crate openssl;
|
||||||
|
#[cfg(feature = "openssl-verify")]
|
||||||
|
extern crate openssl_verify;
|
||||||
#[cfg(feature = "security-framework")]
|
#[cfg(feature = "security-framework")]
|
||||||
extern crate security_framework;
|
extern crate security_framework;
|
||||||
#[cfg(feature = "serde-serialization")]
|
#[cfg(feature = "serde-serialization")]
|
||||||
|
|||||||
15
src/net.rs
15
src/net.rs
@@ -619,7 +619,7 @@ mod openssl {
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use openssl::ssl::{Ssl, SslContext, SslStream, SslMethod, SSL_VERIFY_NONE};
|
use openssl::ssl::{Ssl, SslContext, SslStream, SslMethod, SSL_VERIFY_NONE, SSL_VERIFY_PEER, SSL_OP_NO_SSLV2, SSL_OP_NO_SSLV3};
|
||||||
use openssl::ssl::error::StreamError as SslIoError;
|
use openssl::ssl::error::StreamError as SslIoError;
|
||||||
use openssl::ssl::error::SslError;
|
use openssl::ssl::error::SslError;
|
||||||
use openssl::x509::X509FileType;
|
use openssl::x509::X509FileType;
|
||||||
@@ -651,11 +651,10 @@ mod openssl {
|
|||||||
|
|
||||||
impl Default for OpensslClient {
|
impl Default for OpensslClient {
|
||||||
fn default() -> OpensslClient {
|
fn default() -> OpensslClient {
|
||||||
OpensslClient(SslContext::new(SslMethod::Sslv23).unwrap_or_else(|e| {
|
let mut ctx = SslContext::new(SslMethod::Sslv23).unwrap();
|
||||||
// if we cannot create a SslContext, that's because of a
|
ctx.set_default_verify_paths().unwrap();
|
||||||
// serious problem. just crash.
|
ctx.set_options(SSL_OP_NO_SSLV2 | SSL_OP_NO_SSLV3);
|
||||||
panic!("{}", e)
|
OpensslClient(ctx)
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,8 +663,10 @@ mod openssl {
|
|||||||
type Stream = SslStream<T>;
|
type Stream = SslStream<T>;
|
||||||
|
|
||||||
fn wrap_client(&self, stream: T, host: &str) -> ::Result<Self::Stream> {
|
fn wrap_client(&self, stream: T, host: &str) -> ::Result<Self::Stream> {
|
||||||
let ssl = try!(Ssl::new(&self.0));
|
let mut ssl = try!(Ssl::new(&self.0));
|
||||||
try!(ssl.set_hostname(host));
|
try!(ssl.set_hostname(host));
|
||||||
|
let host = host.to_owned();
|
||||||
|
ssl.set_verify_callback(SSL_VERIFY_PEER, move |p, x| ::openssl_verify::verify_callback(&host, p, x));
|
||||||
SslStream::connect(ssl, stream).map_err(From::from)
|
SslStream::connect(ssl, stream).map_err(From::from)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user