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 包。
错误消息很清楚,它来自 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.*您系统上调用的所有文件!