48

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

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

我一直无法找到描述如何与 Python 建立这种联系的教程。任何帮助表示赞赏。

4

3 回答 3

75

使用psycopg2模块。

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

import psycopg2

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

在这种情况下sslmode,指定 SSL 是必需的。

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

它在 PostgreSQL Connection Strings 文档(另见 Parameter Key Words)和SSL Support中有详细解释。

于 2015-01-30T03:11:19.720 回答
12

您也可以使用带有 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)
于 2019-04-03T09:01:16.740 回答
1

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

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 文档中有一个漂亮的数字(表 33.1)分解了您可以提供的不同选项。如果您想使用任何需要您指定特定证书路径的更高级的选项,您可以使用格式字符串将其放入。

于 2021-05-16T21:39:25.567 回答