Psycopg2 Python SSL支持未在

时间:2016-01-08 19:13:16

标签: 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

以下是我尝试解决问题的方法

  • brew uninstall python
  • which python仍然显示python生活在/usr/local/bin/python,试图卸载这个但不能。并且听说这是操作系统使用的python,不管怎么说都不应该卸载
  • brew install python --with-brewed-openssl --build-from-source
  • pip uninstall psycopg2
  • pip install psycopg2

完成所有这些后,异常仍然发生。我通过#!/usr/bin/env python运行此python脚本不确定它是否重要,但这是一个与which python显示的目录不同的目录

7 个答案:

答案 0 :(得分:6)

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

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;
}

正在对该函数处理在连接语句中指定给psycopg2.connect()的关键字,并将错误作为OperationalError异常返回。

错误实际上是直接在postgresql-lib中生成的 - 您可能想要检查您正在使用的版本,它是如何构建的,如果可能的话,将其升级到支持SSL的版本或从源代码重建它已启用SSL。

postgresql-docs还声明如果sslmode设置为 require verify-ca verify-full,则缺少SSL支持会引发错误即可。请参阅sslmode下的here以供参考。

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

This问题也可能有所帮助。

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

答案 1 :(得分:6)

我有同样的错误,原来是因为我使用的是anaconda版本的psycopg2。为了解决这个问题,我调整了VictorF's solution from here并运行:

conda uninstall psycopg2
sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libssl.1.0.0.dylib /usr/local/lib
sudo ln -s /Users/YOURUSERNAME/anaconda/lib/libcrypto.1.0.0.dylib /usr/local/lib
pip install psycopg2

然后当您运行conda list时,您会在最右侧的列中看到与<pip>一起安装的psycopg2。之后,我刚刚重启了Python,一切正常。

答案 2 :(得分:5)

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

psycopg2.OperationalError: sslmode value "require" invalid when SSL support is not compiled in

以上表明构建psycopg2的Postgres版本没有编译的SSL支持。当您尝试使用ssl=require连接到正在运行的Posgres服务器时,它会抛出此错误。< / p>

您没有提及如何安装Postgres,但由于您使用Homebrew进行其他操作,我建议您同样安装Postgres:

$ brew update
$ brew install postgresql

formula for postgresql表明它依赖于openssl并使用--with-openssl标志集进行编译。它还将安装必要的libpq标头。您可能需要在此步骤之后重新安装psycopg2,以确保它获取正确的库/版本。

有趣的是,有一个bug listed against conda列出了您在系统上安装了psycopg2的conda版本时报告的相同错误 - 在系统上安装了Homebrew postgres - 没有,建议丢失SSL库也可以触发这个。

我建议在重新安装之前卸载任何现有的Postgres版本(包括通过Homebrew安装的任何版本),以尽量减少使用错误的版本的风险。

答案 3 :(得分:3)

正如其他人所说,错误信息似乎来自Postgres。您可以通过键入:psql sslmode=require验证这一点,如果它给你一个pgsql终端然后ssl与postgres一起使用,如果它出错,那么它不会

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

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

或者,这就是我建议的方式,http://postgresapp.com上有一个单击安装程序,也可以让它更容易安装。按照网站上的说明正确安装。

当我在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

导航到您的config目录,默认为:〜/ Library / Application \ Support / Postgres93 / var

启用ssl支持:

vim postgresql.conf
# change this:
# ssl = on
# to this:
ssl = on

重新启动应用,然后使用psql "sslmode=require"

检查ssl

如果可行则通过Python代码尝试。如果它适用于上面的代码,但不适用于Python,那么它肯定是一个需要解决的Python代码问题。

答案 4 :(得分:1)

我无法发表评论:
添加到Brideau的答案,这对我改变我的Postgres版本后只对我有用。

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

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

答案 5 :(得分:0)

如果你正在使用psycopg2的v2.6.1或v2.6.2(和我一样),答案是对v2.7的简单升级。阅读psycopg2的release notes,对SSL有一个小修复,尽管它看起来并不特别相关。

我的设置如下:

  • Mac OS X El Capitan 10.11.6
  • psycopg2 2.6.2通过pip安装
  • 通过Enterprise DB Installer安装的PostgreSQL

运行pip uninstall psycopg2后跟pip install psycopg2已解决的问题。

答案 6 :(得分:-4)

尝试从MacPorts

安装psycopg2
 sudo port install py27-psycopg2