@@ -40,28 +40,23 @@ impl Default for TlsOptions {
40
40
// * Allow disabling Hostname Verification: https://github.com/rustls/rustls/issues/578
41
41
// * Dangerous verifiers API proposal: https://github.com/rustls/rustls/pull/1197
42
42
#[ derive( Debug ) ]
43
- struct TlsServerCertVerifier {
43
+ struct NoHostnameVerificationServerCertVerifier {
44
44
roots : RootCertStore ,
45
45
supported : WebPkiSupportedAlgorithms ,
46
- hostname_verification : bool ,
47
46
}
48
47
49
- impl TlsServerCertVerifier {
50
- fn new ( roots : RootCertStore , hostname_verification : bool ) -> Self {
51
- Self {
52
- roots,
53
- supported : CryptoProvider :: get_default ( ) . unwrap ( ) . signature_verification_algorithms ,
54
- hostname_verification,
55
- }
48
+ impl NoHostnameVerificationServerCertVerifier {
49
+ unsafe fn new ( roots : RootCertStore ) -> Self {
50
+ Self { roots, supported : CryptoProvider :: get_default ( ) . unwrap ( ) . signature_verification_algorithms }
56
51
}
57
52
}
58
53
59
- impl ServerCertVerifier for TlsServerCertVerifier {
54
+ impl ServerCertVerifier for NoHostnameVerificationServerCertVerifier {
60
55
fn verify_server_cert (
61
56
& self ,
62
57
end_entity : & CertificateDer < ' _ > ,
63
58
intermediates : & [ CertificateDer < ' _ > ] ,
64
- server_name : & ServerName < ' _ > ,
59
+ _server_name : & ServerName < ' _ > ,
65
60
_ocsp_response : & [ u8 ] ,
66
61
now : UnixTime ,
67
62
) -> Result < ServerCertVerified , TlsError > {
@@ -74,9 +69,6 @@ impl ServerCertVerifier for TlsServerCertVerifier {
74
69
self . supported . all ,
75
70
) ?;
76
71
77
- if self . hostname_verification {
78
- rustls:: client:: verify_server_name ( & cert, server_name) ?;
79
- }
80
72
Ok ( ServerCertVerified :: assertion ( ) )
81
73
}
82
74
@@ -168,10 +160,16 @@ impl TlsOptions {
168
160
}
169
161
170
162
pub ( crate ) fn into_config ( mut self ) -> Result < ClientConfig > {
163
+ let roots = self . take_roots ( ) ;
171
164
// This has to be called before server cert verifier to install default crypto provider.
172
165
let builder = ClientConfig :: builder ( ) ;
173
- let verifier = TlsServerCertVerifier :: new ( self . take_roots ( ) , self . hostname_verification ) ;
174
- let builder = builder. dangerous ( ) . with_custom_certificate_verifier ( Arc :: new ( verifier) ) ;
166
+ let builder = match self . hostname_verification {
167
+ true => builder. with_root_certificates ( roots) ,
168
+ false => unsafe {
169
+ let verifier = NoHostnameVerificationServerCertVerifier :: new ( roots) ;
170
+ builder. dangerous ( ) . with_custom_certificate_verifier ( Arc :: new ( verifier) )
171
+ } ,
172
+ } ;
175
173
if let Some ( ( client_cert, client_key) ) = self . identity . take ( ) {
176
174
match builder. with_client_auth_cert ( client_cert, client_key) {
177
175
Ok ( config) => Ok ( config) ,
0 commit comments