SQLAlchemy验证SSL连接[英] SQLAlchemy verify SSL connection

本文是小编为大家收集整理的关于SQLAlchemy验证SSL连接的处理方法,想解了SQLAlchemy验证SSL连接的问题怎么解决?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 的文档字符串说:

<块引用>

由此连接管理的底层 DB-API 连接.

然而,你可以从上面看到它实际上返回了一个 sqlalchemy.pool._ConnectionFairy 对象,该对象来自它的文档字符串:

<块引用>

代理一个 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 对象公开有关本机的信息库连接.

该 info 对象具有 ssl_in_use 等属性:

<块引用>

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

以及ssl_attribute:

<块引用>

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

因此,您无需深入挖掘即可了解实际的数据库连接以了解实际情况.

另外,如果你想确保所有客户端连接都是 ssl,你总是可以 force them to.

本文地址:https://www.itbaoku.cn/post/1763851.html