PHP 和 PostgreSQL – 未编译 SSL 支持时 sslmode 值“require”无效

Vil*_*lis 5 php postgresql ssl libpq

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

我的本地环境是 OS X,所有软件包都使用自制程序安装并具有 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 包。

Lau*_*lbe 5

错误消息很清楚,它来自 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
Run Code Online (Sandbox Code Playgroud)

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

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

pg_config --configure
Run Code Online (Sandbox Code Playgroud)

输出将不包含--with-openssl.

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

既然您说 PostgreSQL 是使用 SSL 支持编译的,对此行为的一种解释是您的计算机上安装了多个 PostgreSQL,而 PHP 使用的是不支持 SSL 的构建版本。尝试找到libpq.*您系统上调用的所有文件!