@@ -222,6 +222,7 @@ def _parse_hostlist(hostlist, port, *, unquote=False):
222
222
223
223
def _parse_connect_dsn_and_args (* , dsn , host , port , user ,
224
224
password , passfile , database , ssl ,
225
+ sslcert , sslkey , sslrootcert ,
225
226
connect_timeout , server_settings ):
226
227
# `auth_hosts` is the version of host information for the purposes
227
228
# of reading the pgpass file.
@@ -310,6 +311,21 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
310
311
if ssl is None :
311
312
ssl = val
312
313
314
+ if 'sslcert' in query :
315
+ val = query .pop ('sslcert' )
316
+ if sslcert is None :
317
+ sslcert = val
318
+
319
+ if 'sslkey' in query :
320
+ val = query .pop ('sslkey' )
321
+ if sslkey is None :
322
+ sslkey = val
323
+
324
+ if 'sslrootcert' in query :
325
+ val = query .pop ('sslrootcert' )
326
+ if sslrootcert is None :
327
+ sslrootcert = val
328
+
313
329
if query :
314
330
if server_settings is None :
315
331
server_settings = query
@@ -427,7 +443,7 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
427
443
'`sslmode` parameter must be one of: {}' .format (modes ))
428
444
429
445
# docs at https://www.postgresql.org/docs/10/static/libpq-connect.html
430
- # Not implemented: sslcert & sslkey & sslrootcert & sslcrl params .
446
+ # Not implemented: sslcrl param .
431
447
if sslmode < SSLMode .allow :
432
448
ssl = False
433
449
else :
@@ -442,6 +458,21 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
442
458
else :
443
459
sslmode = SSLMode .disable
444
460
461
+ if sslcert is None :
462
+ sslcert = os .getenv ('PGSSLCERT' )
463
+
464
+ if sslkey is None :
465
+ sslkey = os .getenv ('PGSSLKEY' )
466
+
467
+ if sslrootcert is None :
468
+ sslrootcert = os .getenv ('PGSSLROOTCERT' )
469
+
470
+ if isinstance (ssl , ssl_module .SSLContext ):
471
+ if sslcert :
472
+ ssl .load_cert_chain (sslcert , keyfile = sslkey )
473
+ if sslrootcert :
474
+ ssl .load_verify_locations (cafile = sslrootcert )
475
+
445
476
if server_settings is not None and (
446
477
not isinstance (server_settings , dict ) or
447
478
not all (isinstance (k , str ) for k in server_settings ) or
@@ -463,7 +494,8 @@ def _parse_connect_arguments(*, dsn, host, port, user, password, passfile,
463
494
statement_cache_size ,
464
495
max_cached_statement_lifetime ,
465
496
max_cacheable_statement_size ,
466
- ssl , server_settings ):
497
+ ssl , sslcert , sslkey , sslrootcert ,
498
+ server_settings ):
467
499
468
500
local_vars = locals ()
469
501
for var_name in {'max_cacheable_statement_size' ,
@@ -491,6 +523,7 @@ def _parse_connect_arguments(*, dsn, host, port, user, password, passfile,
491
523
addrs , params = _parse_connect_dsn_and_args (
492
524
dsn = dsn , host = host , port = port , user = user ,
493
525
password = password , passfile = passfile , ssl = ssl ,
526
+ sslcert = sslcert , sslkey = sslkey , sslrootcert = sslrootcert ,
494
527
database = database , connect_timeout = timeout ,
495
528
server_settings = server_settings )
496
529
0 commit comments