SQLAlchemy验证SSL连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLAlchemy验证SSL连接相关的知识,希望对你有一定的参考价值。

我想验证SQLAlchemy在使用create_engine连接到PostgreSQL数据库时设置的SSL连接。例如,如果我有以下Python 3代码:

from sqlalchemy import create_engine

conn_string = "postgresql+psycopg2://myuser:******@someserver:5432/somedb"

conn_args = {
    "sslmode": "verify-full",
    "sslrootcert": "/etc/ssl/certs/ca-certificates.crt",
}

engine = create_engine(conn_string, connect_args=conn_args)

我知道我可以打印engine.__dict__的内容,但它不包含有关它用于连接的SSL设置(TLS版本,密码套件等)的任何信息:

{
    '_echo': False,
    'dialect': <sqlalchemy.dialects.postgresql.psycopg2.PGDialect_psycopg2 object at 0x7f988a217978>,
    'dispatch': <sqlalchemy.event.base.ConnectionEventsDispatch object at 0x7f988938e788>,
    'engine': Engine(postgresql+psycopg2://myuser:******@someserver:5432/somedb),
    'logger': <Logger sqlalchemy.engine.base.Engine (DEBUG)>,
    'pool': <sqlalchemy.pool.impl.QueuePool object at 0x7f988a238c50>,
    'url': postgresql+psycopg2://myuser:******@someserver:5432/somedb
}

我知道我可以做像SELECT * FROM pg_stat_ssl;这样的事情,但SQLAlchemy引擎是否将这种信息存储为类属性/方法?

谢谢!

答案

我不使用postgres所以希望这适用于你。

SQLAlchemy获取您在url中提供的信息,并将其传递给也在url中指定的基础dbapi库,在您的情况下,它是psycopg2。

您的engine实例仅在需要时连接到数据库,sqlalchemy只是将连接信息传递给url中指定的驱动程序,该驱动程序返回sqlalchemy使用的连接。

原谅这是mysql,但对你来说应该基本相同:

>>> engine
Engine(mysql+mysqlconnector://test:***@localhost/test)
>>> conn = engine.connect()
>>> conn
<sqlalchemy.engine.base.Connection object at 0x000001614ACBE2B0>
>>> conn.connection
<sqlalchemy.pool._ConnectionFairy object at 0x000001614BF08630>
>>> conn.connection.connection
<mysql.connector.connection_cext.CMySQLConnection object at 0x000001614AB7E1D0>

调用engine.connect()返回一个sqlalchemy.engine.base.Connection实例,该实例有一个connection property,docstring说明:

此Connection管理的基础DB-API连接。

但是,您可以从上面看到它实际上返回了一个sqlalchemy.pool._ConnectionFairy对象,该对象来自它的docstring:

代理DBAPI连接......

这是连接童话的__init__()方法,你可以看到它有一个connection属性,它是实际的底层dbapi连接。

def __init__(self, dbapi_connection, connection_record, echo):
    self.connection = dbapi_connection
    self._connection_record = connection_record
    self._echo = echo

至于dbapi连接对象上可用的信息,它取决于该特定驱动程序的实现。例如,psycopg2连接对象具有info属性:

一个ConnectionInfo对象,公开有关本机libpq连接的信息。

info对象具有ssl_in_use等属性:

如果连接使用SSL,则为True,否则为False。

ssl_attribute

返回有关连接的SSL相关信息。

所以你不必深入挖掘实际的数据库连接,看看到底发生了什么。

此外,如果要确保所有客户端连接都是ssl,则可以始终使用force them to

以上是关于SQLAlchemy验证SSL连接的主要内容,如果未能解决你的问题,请参考以下文章

python MySQLdb:在没有证书的情况下使用ssl

来自 SQLAlchemy 的加密数据库连接

SSL连接出现的问题

如何使用码头设置 2 路 SSL 身份验证连接

如何使用 Windows 身份验证通过 sqlalchemy 连接到 SQL Server?

SQLAlchemy RDS IAM 登录