Skip to content

Commit 457e26f

Browse files
committed
add support for sslcert, sslkey and sslrootcert parameters
1 parent edefd69 commit 457e26f

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

asyncpg/connect_utils.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ def _parse_hostlist(hostlist, port, *, unquote=False):
222222

223223
def _parse_connect_dsn_and_args(*, dsn, host, port, user,
224224
password, passfile, database, ssl,
225+
sslcert, sslkey, sslrootcert,
225226
connect_timeout, server_settings):
226227
# `auth_hosts` is the version of host information for the purposes
227228
# of reading the pgpass file.
@@ -310,6 +311,21 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
310311
if ssl is None:
311312
ssl = val
312313

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+
313329
if query:
314330
if server_settings is None:
315331
server_settings = query
@@ -427,7 +443,7 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
427443
'`sslmode` parameter must be one of: {}'.format(modes))
428444

429445
# 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.
431447
if sslmode < SSLMode.allow:
432448
ssl = False
433449
else:
@@ -442,6 +458,21 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
442458
else:
443459
sslmode = SSLMode.disable
444460

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+
445476
if server_settings is not None and (
446477
not isinstance(server_settings, dict) or
447478
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,
463494
statement_cache_size,
464495
max_cached_statement_lifetime,
465496
max_cacheable_statement_size,
466-
ssl, server_settings):
497+
ssl, sslcert, sslkey, sslrootcert,
498+
server_settings):
467499

468500
local_vars = locals()
469501
for var_name in {'max_cacheable_statement_size',
@@ -491,6 +523,7 @@ def _parse_connect_arguments(*, dsn, host, port, user, password, passfile,
491523
addrs, params = _parse_connect_dsn_and_args(
492524
dsn=dsn, host=host, port=port, user=user,
493525
password=password, passfile=passfile, ssl=ssl,
526+
sslcert=sslcert, sslkey=sslkey, sslrootcert=sslrootcert,
494527
database=database, connect_timeout=timeout,
495528
server_settings=server_settings)
496529

asyncpg/connection.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,9 @@ async def connect(dsn=None, *,
17551755
max_cacheable_statement_size=1024 * 15,
17561756
command_timeout=None,
17571757
ssl=None,
1758+
sslcert=None,
1759+
sslkey=None,
1760+
sslrootcert=None,
17581761
connection_class=Connection,
17591762
record_class=protocol.Record,
17601763
server_settings=None):
@@ -1897,6 +1900,17 @@ async def connect(dsn=None, *,
18971900
.. note::
18981901
18991902
*ssl* is ignored for Unix domain socket communication.
1903+
1904+
:param sslcert:
1905+
This parameter specifies the file name of the client SSL certificate.
1906+
1907+
:param sslkey:
1908+
This parameter specifies the location for the secret key used for
1909+
the client certificate.
1910+
1911+
:param sslrootcert:
1912+
This parameter specifies the name of a file containing SSL certificate
1913+
authority (CA) certificate(s).
19001914
19011915
:param dict server_settings:
19021916
An optional dict of server runtime parameters. Refer to
@@ -1990,6 +2004,9 @@ async def connect(dsn=None, *,
19902004
password=password,
19912005
passfile=passfile,
19922006
ssl=ssl,
2007+
sslcert=sslcert,
2008+
sslkey=sslkey,
2009+
sslrootcert=sslrootcert,
19932010
database=database,
19942011
server_settings=server_settings,
19952012
command_timeout=command_timeout,

0 commit comments

Comments
 (0)