【问题标题】:Psycopg2 Python SSL Support is not compiled inPsycopg2 Python SSL 支持未编译
【发布时间】:2016-04-13 13:38:45
【问题描述】:

我正在尝试使用带有 sslmode='required' 参数的 psycopg2 连接到我的 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 显示的目录不同

【问题讨论】:

  • 您的数据库是否已编译所需的 ssl 支持?
  • 您能提供pip install psycopg2 命令的输出吗?另外,您安装了哪个版本的 psycopg(使用 pip list 可见)?
  • @andreas-hofmann pip install psycopg2 显示Requirement already satisfied (use --upgrade to upgrade): psycopg2 in /usr/local/lib/python2.7/site-packages。当我运行pip list 时,我得到psycopg2 (2.6.1)
  • 好的,所以我在答案中猜到的版本匹配。我想看看在构建模块时是否有任何警告等,但这不重要。我仍然认为您需要安装支持 SSL 的 libpq...
  • 你是如何安装你的 postgres 服务器的?

标签: python postgresql python-2.7 ssl psycopg2


【解决方案1】:

由于您是通过 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 设置为 requireverify-caverify-full,缺少 SSL 支持会引发错误。请参阅sslmode 下的here 以供参考。

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

This 问题也可能有帮助。

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

【讨论】:

    【解决方案2】:

    我遇到了同样的错误,原来是因为我使用的是 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,一切正常。

    【讨论】:

      【解决方案3】:

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

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

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

      您没有提及如何安装 Postgres,但由于您将 Homebrew 用于其他用途,我建议您也以相同的方式安装 Postgres:

      $ brew update
      $ brew install postgresql
      

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

      有趣的是,有一个 bug listed against conda 列出了您报告的相同错误,当您报告的 conda 版本 psycopg2(链接到使用 Homebrew postgres 的系统上)安装在没有安装的系统上时,表明缺少 SSL 库也可以触发这个。

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

      【讨论】:

        【解决方案4】:

        正如其他人所说,错误消息似乎来自 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
        

        导航到您的配置目录,默认为:~/Library/Application\ Support/Postgres93/var

        启用 ssl 支持:

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

        重启应用,然后用psql "sslmode=require"检查ssl

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

        【讨论】:

          【解决方案5】:

          因为我无法评论:
          添加到 Brideau 的回答中,这仅在更改我的 Postgres 版本后对我有用。

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

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

          【讨论】:

            【解决方案6】:

            如果您使用的是 v2.6.1 或 v2.6.2 的 psycopg2(像我一样),答案是简单升级到 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 已解决问题。

            【讨论】:

              【解决方案7】:

              尝试从MacPorts安装psycopg2

               sudo port install py27-psycopg2
              

              【讨论】:

                猜你喜欢
                • 2016-12-18
                • 2021-09-11
                • 2018-10-20
                • 1970-01-01
                • 1970-01-01
                • 2020-09-22
                • 2015-10-02
                • 2011-12-23
                • 2020-12-15
                相关资源
                最近更新 更多