[utils] Default SSL to TLS. (Fixes #3727)
On 2.x, we now try TLS first, and fall back to the compat 23 (basically anything) afterwards. On 3.4+, we now use the proper function so that we get all the latest security configurations. We allow SSLv3 though for the time being, since a lot of older pages use that. On 3.3, we default to SSLv23 (basically "anything, including TLS") because that has the widest compatibility.
This commit is contained in:
		@@ -617,7 +617,7 @@ def make_HTTPS_handler(opts_no_check_certificate, **kwargs):
 | 
				
			|||||||
                    self.sock = sock
 | 
					                    self.sock = sock
 | 
				
			||||||
                    self._tunnel()
 | 
					                    self._tunnel()
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv3)
 | 
					                    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
 | 
				
			||||||
                except ssl.SSLError:
 | 
					                except ssl.SSLError:
 | 
				
			||||||
                    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv23)
 | 
					                    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_SSLv23)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -625,8 +625,14 @@ def make_HTTPS_handler(opts_no_check_certificate, **kwargs):
 | 
				
			|||||||
            def https_open(self, req):
 | 
					            def https_open(self, req):
 | 
				
			||||||
                return self.do_open(HTTPSConnectionV3, req)
 | 
					                return self.do_open(HTTPSConnectionV3, req)
 | 
				
			||||||
        return HTTPSHandlerV3(**kwargs)
 | 
					        return HTTPSHandlerV3(**kwargs)
 | 
				
			||||||
    else:
 | 
					    elif hasattr(ssl, 'create_default_context'):  # Python >= 3.4
 | 
				
			||||||
        context = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
 | 
					        context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
 | 
				
			||||||
 | 
					        context.options &= ~ssl.OP_NO_SSLv3  # Allow older, not-as-secure SSLv3
 | 
				
			||||||
 | 
					        if opts_no_check_certificate:
 | 
				
			||||||
 | 
					            context.verify_mode = ssl.CERT_NONE
 | 
				
			||||||
 | 
					        return compat_urllib_request.HTTPSHandler(context=context, **kwargs)
 | 
				
			||||||
 | 
					    else:  # Python < 3.4
 | 
				
			||||||
 | 
					        context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
 | 
				
			||||||
        context.verify_mode = (ssl.CERT_NONE
 | 
					        context.verify_mode = (ssl.CERT_NONE
 | 
				
			||||||
                               if opts_no_check_certificate
 | 
					                               if opts_no_check_certificate
 | 
				
			||||||
                               else ssl.CERT_REQUIRED)
 | 
					                               else ssl.CERT_REQUIRED)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user