PHP& PostgreSQL - sslmode值"要求"未编译SSL支持时无效

时间:2018-05-10 11:48:01

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

2 个答案:

答案 0 :(得分:3)

错误信息很明显,它来自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.*的所有文件!

答案 1 :(得分:0)

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

brew install postgresql

想发贴,以防其他遇到相同问题的人使用。