【问题标题】:PHP & PostgreSQL – sslmode value "require" invalid when SSL support is not compiledPHP & PostgreSQL – 未编译 SSL 支持时 sslmode 值“require”无效
【发布时间】:2018-10-20 16:29:24
【问题描述】:

我正在尝试连接到仅支持 SSL 连接的 Heroku Postgres。 SSL 连接在其他工具(Postico)和编程环境(Node.js)上工作正常,但是从 PHP 连接时,我总是收到此错误: sslmode value "require" invalid when SSL support is not compiled

我的本​​地环境是 OS X,所有软件包都安装了 homebrew 并支持 SSL。 pgsql 还具有基于 phpinfo() 输出的 SSL 支持: SSL support => enabled

Libpq 和 Postgres 编译时支持 SSL: -lpgcommon -lpgport -lssl -lcrypto -lz -lreadline -lm

PHP版本:7.2.5(也试过5.6、7.1分支) 本地 Postgres 和 libpq 版本:10.3

尝试了所有我可以但无法使此连接正常工作的解决方案。通过自制软件安装时,Postgres 支持为 PHP 7.2.5 开箱即用。不再有单独的 php-pgsql/php-pdo-pgsql 包。

【问题讨论】:

  • 发现了这个和其他一些 SO 主题,但在我的情况下,SSL 支持已编译,看起来问题有点不同。来自 phpinfo(): "OpenSSL support => enabled"
  • 然后收回标志:)
  • 所以你试图从本地连接一个远程heroku PSQL?还有php -i | grep -i SSL的输出是什么@
  • 是的,就是这样。该命令的输出非常大,但这里有一些与 SSL 相关的设置:SSL support => enabled OpenSSL support => enabled 并且 PHP 是使用此标志构建的:'--with-openssl=/usr/local/opt/openssl'

标签: php postgresql ssl libpq


【解决方案1】:

错误信息很清楚,它来自PostgreSQL的libpq中的这段代码:

#ifndef USE_SSL
        switch (conn->sslmode[0])
        {
            case 'a':           /* "allow" */
            case 'p':           /* "prefer" */

                /*
                 * warn user that an SSL connection will never be negotiated
                 * since SSL was not compiled in?
                 */
                break;

            case 'r':           /* "require" */
            case 'v':           /* "verify-ca" or "verify-full" */
                conn->status = CONNECTION_BAD;
                printfPQExpBuffer(&conn->errorMessage,
                                  libpq_gettext("sslmode value \"%s\" invalid when SSL support is not compiled in\n"),
                                  conn->sslmode);
                return false;
        }
#endif

该代码仅在配置 PostgreSQL --with-openssl 时编译。

您可以使用pg_config 进行验证(如果您没有从源代码安装 PostgreSQL,则可能需要为此安装“dev”或“devel”包):

pg_config --configure

输出将包含--with-openssl

很可能 PHP 是使用 SSL 支持构建的,但 PostgreSQL 不是。

既然你说 PostgreSQL 是在支持 SSL 的情况下编译的,那么对这种行为的一种解释是你的机器上有几个 PostgreSQL 安装,而 PHP 使用的是一个不支持 SSL 的构建。尝试在您的系统上查找所有名为 libpq.* 的文件!

【讨论】:

    【解决方案2】:

    我在使用 MAMP 和 PHP7.2.1 连接 Heroku 上的 PostgreSQL 时遇到了同样的问题。即使在 phpinfo() 中显示为启用了 openSSL 和 pgsql SSL 支持,仍会出现“未编译 SSL 支持时,sslmode 值“要求”无效”。通过自制软件安装 postgresql 为我解决了这个问题。

    brew install postgresql
    

    想要发布以防万一这适用于遇到同样问题的其他人。

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2016-07-11
      • 2016-04-13
      • 2016-12-18
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多