Python3:使用SSL连接到远程Postgres数据库

时间:2017-12-13 19:20:54

标签: database python-3.x postgresql ssl psycopg2

我正在设置远程PostgreSQL数据库。服务器正在运行CentOS 7和PostgreSQL-9.5。目前,我正在测试用户是否可以查询数据库。为此,我有以下内容:

import psycopg2

host    = 'server1'
dbname  = 'test_db'
user    = 'test-user'

sslcert = 'test-db.crt'
sslmode = 'verify-full' 
sslkey  = 'test-db.key'


dsn = 'host={0} dbname={1} user={2} sslcert={3} sslmode={4} sslkey={5}'.format(host, dbname, user, sslcert, sslmode, sslkey)

conn = psycopg2.connect(dsn)

连接超时,出现以下错误:

psycopg2.OperationalError: could not connect to server: Connection timed out (0x0000274C/10060)
    Is the server running on host "server1" (xx.xx.xx.xx) and accepting
    TCP/IP connections on port 5432?

我尝试过几件事(如下所示)。我试图确定问题存在的哪一方:Python端或数据库配置:

  • Python语法是否正确?
  • 我在哪里可以找到有关DSN参数的文档,例如sslmodesslcertsslkey
  • 是否有更适合此类连接的不同套餐?
  • 我应该问其他什么问题?

我检查过以下内容:

  1. ' server1的'输入正确,Python返回的IP地址对应
  2. 所有其他参数拼写正确并引用正确的对象
  3. Postgres目前正在投放(service postgres-9.5 status显示"有效")
  4. Postgres正在侦听端口5432(netstat -na | grep tcp显示" LISTEN"在端口5432上)
  5. 我的桌子正在运行SSL(psql -U username -W -d test-db -h host返回SSL connection (protocol: TLSAv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
  6. user=test-user已作为超级用户添加到postgres
  7. 我的理解是psycopg2是现在使用的合适包。我已经搜索了documentation,但没有找到有关SSL连接的大量信息。我发现这个SO post使用psycog2讨论了SSL连接,但我无法将某些语法与文档相匹配。

    在Python脚本中,我在所有4种组合中尝试了以下内容:

    1. 使用sslmode='require'
    2. 使用test-db.crttest-db.key
    3. 的绝对路径

1 个答案:

答案 0 :(得分:1)

您似乎已经为自己展示了False Dilemma。问题不在于Python和数据库配置之间。其间存在可能导致断开的其他实体。

  
      
  • Python语法是否正确?
  •   

是。语法在psycopg2.connect()文档中描述。它的格式为:

psycopg2.connect(dsn=None, connection_factory=None, cursor_factory=None, async=False, **kwargs)

其中DSN(Data Source Name)可以作为单个字符串或单独的参数给出:

conn = psycopg2.connect(dsn="dbname=test user=postgres password=secret")

conn = psycopg2.connect(dbname="test", user="postgres", password="secret")
  
      
  • 我在哪里可以找到有关DSN参数的文档,例如sslmode,sslcert和sslkey?
  •   

请注意,作为DSN参数,它们不是psycopg2模块的一部分。它们由数据库定义,在本例中为Postgres。它们可以在Parameter Key Words部分的“数据库连接控制函数”一章中找到。

  
      
  • 我应该问其他什么问题?
  •   

也许,

主机(PostgresSQL服务器)和客户端(本地Python实例)之间是否有任何阻止通信的东西?

对此的一个答案是"防火墙。"结果证明是问题所在。 Postgres正在倾听,Python正在接触。但门关上了。