|  | 
| 18 | 18 | 
 | 
| 19 | 19 | from abc import ABCMeta | 
| 20 | 20 | from collections.abc import Mapping | 
| 21 |  | -from warnings import warn | 
| 22 | 21 | 
 | 
|  | 22 | +from ._conf import ( | 
|  | 23 | +    TrustAll, | 
|  | 24 | +    TrustCustomCAs, | 
|  | 25 | +    TrustSystemCAs, | 
|  | 26 | +) | 
| 23 | 27 | from .api import ( | 
| 24 | 28 |     DEFAULT_DATABASE, | 
| 25 | 29 |     TRUST_ALL_CERTIFICATES, | 
| @@ -205,9 +209,9 @@ def __iter__(self): | 
| 205 | 209 | 
 | 
| 206 | 210 | def _trust_to_trusted_certificates(pool_config, trust): | 
| 207 | 211 |     if trust == TRUST_SYSTEM_CA_SIGNED_CERTIFICATES: | 
| 208 |  | -        pool_config.trusted_certificates = None | 
|  | 212 | +        pool_config.trusted_certificates = TrustSystemCAs() | 
| 209 | 213 |     elif trust == TRUST_ALL_CERTIFICATES: | 
| 210 |  | -        pool_config.trusted_certificates = [] | 
|  | 214 | +        pool_config.trusted_certificates = TrustAll() | 
| 211 | 215 | 
 | 
| 212 | 216 | 
 | 
| 213 | 217 | class PoolConfig(Config): | 
| @@ -241,12 +245,13 @@ class PoolConfig(Config): | 
| 241 | 245 |     # Specify whether to use an encrypted connection between the driver and server. | 
| 242 | 246 | 
 | 
| 243 | 247 |     #: SSL Certificates to Trust | 
| 244 |  | -    trusted_certificates = None | 
|  | 248 | +    trusted_certificates = TrustSystemCAs() | 
| 245 | 249 |     # Specify how to determine the authenticity of encryption certificates | 
| 246 | 250 |     # provided by the Neo4j instance on connection. | 
| 247 |  | -    # * None: Use system trust store. (default) | 
| 248 |  | -    # * []: Trust any certificate. | 
| 249 |  | -    # * ["<path>", ...]: Trust the specified certificate(s). | 
|  | 251 | +    # * `neo4j.TrustSystemCAs()`: Use system trust store. (default) | 
|  | 252 | +    # * `neo4j.TrustAll()`: Trust any certificate. | 
|  | 253 | +    # * `neo4j.TrustCustomCAs("<path>", ...)`: | 
|  | 254 | +    #       Trust the specified certificate(s). | 
| 250 | 255 | 
 | 
| 251 | 256 |     #: Custom SSL context to use for wrapping sockets | 
| 252 | 257 |     ssl_context = None | 
| @@ -296,26 +301,25 @@ def get_ssl_context(self): | 
| 296 | 301 |         ssl_context.options |= ssl.OP_NO_TLSv1      # Python 3.2 | 
| 297 | 302 |         ssl_context.options |= ssl.OP_NO_TLSv1_1    # Python 3.4 | 
| 298 | 303 | 
 | 
| 299 |  | -        if self.trusted_certificates is None: | 
|  | 304 | +        if isinstance(self.trusted_certificates, TrustAll): | 
|  | 305 | +            # trust any certificate | 
|  | 306 | +            ssl_context.check_hostname = False | 
|  | 307 | +            # https://docs.python.org/3.7/library/ssl.html#ssl.CERT_NONE | 
|  | 308 | +            ssl_context.verify_mode = ssl.CERT_NONE | 
|  | 309 | +        elif isinstance(self.trusted_certificates, TrustCustomCAs): | 
|  | 310 | +            # trust the specified certificate(s) | 
|  | 311 | +            ssl_context.check_hostname = True | 
|  | 312 | +            ssl_context.verify_mode = ssl.CERT_REQUIRED | 
|  | 313 | +            for cert in self.trusted_certificates.certs: | 
|  | 314 | +                ssl_context.load_verify_locations(cert) | 
|  | 315 | +        else: | 
|  | 316 | +            # default | 
| 300 | 317 |             # trust system CA certificates | 
| 301 | 318 |             ssl_context.check_hostname = True | 
| 302 | 319 |             ssl_context.verify_mode = ssl.CERT_REQUIRED | 
| 303 | 320 |             # Must be load_default_certs, not set_default_verify_paths to | 
| 304 | 321 |             # work on Windows with system CAs. | 
| 305 | 322 |             ssl_context.load_default_certs() | 
| 306 |  | -        else: | 
| 307 |  | -            self.trusted_certificates = tuple(self.trusted_certificates) | 
| 308 |  | -            if not self.trusted_certificates: | 
| 309 |  | -                # trust any certificate | 
| 310 |  | -                ssl_context.check_hostname = False | 
| 311 |  | -                # https://docs.python.org/3.7/library/ssl.html#ssl.CERT_NONE | 
| 312 |  | -                ssl_context.verify_mode = ssl.CERT_NONE | 
| 313 |  | -            else: | 
| 314 |  | -                # trust the specified certificate(s) | 
| 315 |  | -                ssl_context.check_hostname = True | 
| 316 |  | -                ssl_context.verify_mode = ssl.CERT_REQUIRED | 
| 317 |  | -                for cert in self.trusted_certificates: | 
| 318 |  | -                    ssl_context.load_verify_locations(cert) | 
| 319 | 323 | 
 | 
| 320 | 324 |         return ssl_context | 
| 321 | 325 | 
 | 
|  | 
0 commit comments