【问题标题】:How to connect to a remote PostgreSQL database through SSL with Python如何使用 Python 通过 SSL 连接到远程 PostgreSQL 数据库
【发布时间】:2015-03-29 11:27:17
【问题描述】:

我想通过 Python 连接到远程 PostgreSQL 数据库来做一些基本的数据分析。该数据库需要 SSL (verify-ca),以及三个文件(我有):

  • 服务器根证书文件
  • 客户端证书文件
  • 客户端密钥文件

我无法找到描述如何使用 Python 建立这种连接的教程。 任何帮助表示赞赏。

【问题讨论】:

  • psycopg2。在谷歌中搜索。
  • @GamesBrainiac 谢谢。我有。问题在于添加的 ssl 要求。我找不到那个语法。
  • @Pep,这里描述了 SSL 选项:postgresql.org/docs/current/static/… 您可以将其中任何一个传递给 connect 方法。

标签: python postgresql python-2.7 ssl python-3.6


【解决方案1】:

使用psycopg2 模块。

您需要在连接字符串中使用 ssl 选项,或者将它们添加为关键字参数:

import psycopg2

conn = psycopg2.connect(dbname='yourdb', user='dbuser', password='abcd1234', host='server', port='5432', sslmode='require')

在这种情况下,sslmode 指定需要 SSL。

要执行服务器证书验证,您可以将sslmode 设置为verify-fullverify-ca。您需要在sslrootcert 中提供服务器证书的路径。还将sslcertsslkey 值分别设置为您的客户端证书和密钥。

PostgreSQLConnection Strings documentation(另见参数关键字)和SSL Support中有详细说明。

【讨论】:

  • 在 django 中,如果您指定如下内容,则此方法有效:` 'OPTIONS': { 'sslmode': 'verify-full', 'sslrootcert': '/etc/pki/CA/certs/cabundle. pem'}` 作为 DATABASES['default'] 字典的额外“选项”。
  • 请注意,根据psycopg2 documentationdatabasedbname 的弃用别名。
  • @ljhennessy:感谢您指出这一点。我已经相应地更新了答案。
  • 使用 MacOS 和 sqlalchemy 的用户请注意,在运行 create_engine() 之前运行 pip install psycopg2-binary
  • "您需要在 sslrootcert 中提供服务器证书的路径。同时将 sslcert 和 sslkey 值分别设置为您的客户端证书和密钥。"供应哪里?有人可以修改示例吗
【解决方案2】:

您也可以使用带有 paramiko 和 sshtunnel 的 ssh 隧道:

import psycopg2
import paramiko
from sshtunnel import SSHTunnelForwarder

mypkey = paramiko.RSAKey.from_private_key_file('/path/to/private/key')

tunnel =  SSHTunnelForwarder(
        (host_ip, 22),
        ssh_username=username,
        ssh_pkey=mypkey,
        remote_bind_address=('localhost', psql_port))

tunnel.start()
conn = psycopg2.connect(dbname='gisdata', user=psql_username, password=psql_password, host='127.0.0.1', port=tunnel.local_bind_port)

【讨论】:

    【解决方案3】:

    添加这个是为了完整性,因为我在 SO 的其他任何地方都找不到它。就像@mhawke 所说,您可以使用psycopg2,但您也可以使用任何其他Python 数据库模块(ORM 等),这些模块允许您手动指定数据库postgresql URI(postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...])以连接到sslmode="require" psycopg2.connect 用于强制 ssl 连接的参数只是用于连接到数据库的 postgresql:// URI 的一部分(请参阅 33.1.2. Parameter Key Words)。因此,如果您想使用 sqlalchemy 或其他 ORM 而不是普通的 psycopg2,则可以将所需的 sslmode 添加到数据库 URI 的末尾并以这种方式连接。

    import sqlalchemy
    
    DATABASE_URI = "postgresql://postgres:postgres@localhost:5432/dbname"
    # sqlalchemy 1.4+ uses postgresql:// instead of postgres://
    ssl_mode = "?sslmode=require"
    DATABASE_URI += ssl_mode
    
    engine = sqlalchemy.create_engine(URI)
    Session = sqlalchemy.orm.sessionmaker(bind=engine)
    

    关于 SSL 支持的 postgres 文档中有一个漂亮的数字 (Table 33.1),它分解了您可以提供的不同选项。如果您想使用任何需要您指定特定证书路径的更高级选项,您可以使用格式字符串将其放入。

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多