未在中编译Psycopg2 Python SSL支持

未在中编译Psycopg2 Python SSL支持,python,postgresql,python-2.7,ssl,psycopg2,Python,Postgresql,Python 2.7,Ssl,Psycopg2,我正在尝试使用psycopg2和sslmode='required'参数连接到我的postgres数据库;但是,我得到了以下错误 psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in 这里有一些关于我的系统的细节 Mac OS X El Capitan Python 2.7 通过pip安装psycopg2 通过自制安装python 下面是我试图解决这个问题

我正在尝试使用psycopg2和sslmode='required'参数连接到我的postgres数据库;但是,我得到了以下错误

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
这里有一些关于我的系统的细节

  • Mac OS X El Capitan
  • Python 2.7
  • 通过pip安装psycopg2
  • 通过自制安装python
下面是我试图解决这个问题的方法

  • brew卸载python
  • 哪个python
    仍然显示了生活在
    /usr/local/bin/python
    中的python,试图卸载此文件,但无法卸载。听说这是操作系统使用的python,无论如何都不应该卸载
  • brew安装python——使用brew openssl——从源代码构建
  • pip卸载psycopg2
  • pip安装psycopg2

在完成所有这些之后,异常仍然会发生。我正在通过
#运行这个python脚本/usr/bin/env python
不确定它是否重要,但它与python
显示的
目录不同,请尝试从中安装
psycopg2


由于您是通过pip安装的,因此应该使用最新版本的psycopg2(2.6.1)。 在对代码进行了一点挖掘之后,似乎在connection_int.c中抛出了异常,它直接调用postgresql-c库来设置db连接。电话是这样打的:

self->pgconn = pgconn = PQconnectStart(self->dsn);

Dprintf("conn_connect: new postgresql connection at %p", pgconn);

if (pgconn == NULL)
{
    Dprintf("conn_connect: PQconnectStart(%s) FAILED", self->dsn);
    PyErr_SetString(OperationalError, "PQconnectStart() failed");
    return -1;
}
else if (PQstatus(pgconn) == CONNECTION_BAD)
{
    Dprintf("conn_connect: PQconnectdb(%s) returned BAD", self->dsn);
    PyErr_SetString(OperationalError, PQerrorMessage(pgconn));
    return -1;
}
在connect语句中指定给psycopg2.connect()的关键字将被处理到该函数,错误将作为OperationalError异常返回

该错误实际上是直接在postgresql库中生成的-您可能需要检查您正在使用的版本、它是如何生成的,如果可能,请将其升级到支持SSL的版本,或者从启用SSL的源代码重新生成

postgresql文档还声明,如果sslmode设置为requireverify caverify full,则缺少SSL支持将引发错误。有关参考信息,请参见
sslmode
下的

列出了从二进制软件包安装postgres的几种方法,因此您可以选择一种适合您需要的方法。我不熟悉OSX,所以我没有最好的建议

这个问题可能也有帮助


您还需要重新安装psycopg2模块,请确保在重建它时使用新安装的lib。请参阅链接问题(简而言之,在运行
pip install psycopg2
时,您需要将新安装中包含的
pg_config
路径放在$path中。)

您收到的错误是由Postgres本身的问题引起的,而不是
psycopg2

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in
上述情况表明,构建psycopg2
所依据的Postgres版本没有编译的SSL支持。当您尝试使用
ssl=require
连接到正在运行的Posgres服务器时,它会抛出此错误

您没有提到如何安装Postgres,但由于您正在使用自制软件进行其他操作,我建议您也以同样的方式安装Postgres:

$ brew update
$ brew install postgresql
显示它依赖于
openssl
,并使用
--设置了openssl
标志进行编译。它还将安装必要的
libpq
标题。完成此步骤后,您可能需要重新安装
psycopg2
,以确保它选择正确的库/版本

有趣的是,有一个列表列出了您报告的相同错误,该错误发生在带有自制postgres的系统上链接的
psycopg2
的conda版本安装在没有的系统上时,这表明缺少SSL库也会触发此错误


我建议在重新安装之前卸载任何现有的Postgres版本(包括任何通过自制安装的版本),以最大限度地降低使用错误版本的风险。

正如其他人所说,错误消息似乎来自Postgres。您可以通过键入来验证这一点:
psql sslmode=require
如果它提供pgsql终端,那么ssl可以与postgres一起工作,如果它出错,那么它不会

尝试删除postgres并使用openssl支持重新安装:

brew uninstall postgres
brew update
brew install postgres --with-openssl
vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on
或者,这是我建议的方式,有一个一键式安装程序,也可能使它更容易安装。按照网站上的说明正确安装

当我在Yosemite上安装它时,它安装在~/Library/Application\Support/Postgres93/var

您还需要从注册商处创建一个证书(这也可能是错误的来源),如果这是一个面向公众的证书,或者是针对开发/测试环境的自签名证书

openssl req -new -text -out server.req
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
openssl req -x509 -in server.req -text -key server.key -out server.crt
chmod og-rwx server.key
导航到您的配置目录,默认为:~/Library/Application\Support/Postgres93/var

启用ssl支持:

brew uninstall postgres
brew update
brew install postgres --with-openssl
vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on
重新启动应用程序,然后使用psql“sslmode=require”检查ssl


如果这样做有效,那么请通过Python代码进行尝试。如果它能与上面的代码一起工作,但不能与Python一起工作,那么它肯定是一个需要解决的Python代码问题。

我遇到了同样的错误,这是因为我使用的是Anaconda版本的psycopg2。要修复它,我必须调整并运行:

然后,当您运行
conda list
时,您将在最右边的列中看到安装有
的psycopg2。之后,我重新启动了Python,一切正常。

因为我无法发表评论:
Brideau的回答是,这只在我改变了Postgres的版本后对我有效

brew uninstall postgres
brew update
brew install postgres --with-openssl

然后运行Brideau提供的代码,它应该可以工作

如果您使用的是psycopg2的v2.6.1或v2.6.2(像我一样),那么答案就是简单地升级到v2.7。在阅读psycopg2的文章时,有一个针对SSL的小补丁,尽管它看起来并不特别相关

我的设置如下:

  • Mac OS X El Capitan 10.11.6
  • psycopg2