如何解决 Postgresql SCRAM 身份验证问题?

Posted

技术标签:

【中文标题】如何解决 Postgresql SCRAM 身份验证问题?【英文标题】:How can I solve Postgresql SCRAM authentifcation problem? 【发布时间】:2022-01-19 13:25:51 【问题描述】:

将项目转移到生产环境后出现错误。使用生产服务器运行时报错如下

pg_connect():无法连接到 PostgreSQL 服务器:SCRAM 身份验证需要 libpq 版本 10 或更高版本。

这是我的 postgreSQL 版本:

开发版:

x86_64-pc-linux-gnu 上的 PostgreSQL 11.5,由 gcc (GCC) 4.8.5 编译 20150623 (红帽 4.8.5-36),64 位

生产版本:

x86_64-pc-linux-gnu 上的 PostgreSQL 11.5 (EnterpriseDB Advanced Server 11.5.12),由 gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) 编译,64 位

【问题讨论】:

您的客户端计算机上可能有一个旧的 libpq @a_horse_with_no_name 是否有重复的 libpq 文件? 我们应该怎么知道? “已安装”版本是指服务器,而不是客户端(您的程序运行的地方) 我已经通过运行 select version() 检查了开发 postgre 版本和生产服务器之间的两个版本,结果我在我的问题中发布。请仔细阅读我的问题,您将安装两个版本 您需要检查客户端(运行代码的位置)上的版本,而不是服务器 【参考方案1】:

您的应用程序使用与 PostgreSQL 客户端 C 库 libpq 链接的 API。

该库的版本必须为 9.6 或更低版本,并且在 v10 中引入了 SCRAM 身份验证。

升级libpq在应用端再试一次。

如果不需要scram-sha-256认证,可以恢复为md5

postgresql.conf 中设置password_encryption = md5pg_hba_conf中的认证方式改为md5 重新加载 PostgreSQL 修改用户密码获取MD5加密密码

【讨论】:

您是否有链接教程与您将我的库升级到版本 10 的答案相关? 你是如何在客户端机器上安装libpq的?可能您必须对新版本重复这些步骤。 如果来自操作系统发行版,或许可以升级操作系统?不过,从 PostgreSQL 网页安装软件包可能更容易。但是你可能还需要一个新版本的模块,它与libpq 链接。 或者您可以回复到md5。请参阅我的扩展答案。 @AlifRamdani 您可以使用 EnterpriseDB 中的安装程序,也可以从 ZIP 文件中获取 libpq.dll 及其依赖库。【参考方案2】:

遇到了同样的问题并应用了@Laurenz Albe 的修复程序,但由于加密策略更改,我的数据库用户会收到身份验证错误。

所以不要用md5替换scram-sha-256,而是用pg_hba.conf中的trust替换它

【讨论】:

trust 替换它使您的postgresql 甚至不需要身份验证即可进入。我认为这是一种不好的方法 不要这样做! trust 身份验证禁用身份验证。 我知道这是不安全的,但这是唯一对我有用的方法。 (仍然不安全)【参考方案3】:

我曾经在laravel 8 中运行php artisan migrate 时收到错误SCRAM 身份验证需要libpq 版本10 或更高版本。然后我将其修复如下:将身份验证从scram-sha-256更改为md5,然后reset your passwordrestart the postgresql-x64-13 service,这里是一步一步的:

    第一步:在C:\Program Files\PostgreSQL\13\data中找到文件postgresql.conf,然后设置password_encryption = md5 第 2 步:在C:\Program Files\PostgreSQL\13\data 中找到文件pg_hba.conf,然后将所有METHOD 更改为md5 第三步:打开command line (cmd,cmder,git bash...)运行psql -U postgres,安装postgres sql时输入密码 第 4 步:然后在命令行中运行 ALTER USER postgres WITH PASSWORD 'new-password' 更改密码 最终:在您的Service 中重新启动服务postgresql-x64-13

【讨论】:

第4步,请记得有“;”在行尾。这让我想了半天。成功运行会在 psql 窗口中返回“ALTER ROLE” 另外,我发现根据不同的机器,我必须在步骤 3 中实际使用不同的密码,并在步骤 5 中重新启动计算机【参考方案4】:

如果您想保留 scram-sha-256 以确保安全。您需要更新您的客户端 postgreSQL 库,因为 php-pgsql 默认版本不支持它。

CentOS/Rhel/Rocky

yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum instal postgresql13

这将更新服务器/客户端 libpq 以继续使用 scram-sha-256

【讨论】:

【参考方案5】:
RUN apt-get -y update \
    && apt-get install -y build-essential gettext libpq-dev\
    && apt-get install -y wkhtmltopdf\
    && apt-get install -y gdal-bin\
    && apt-get install -y libgdal-dev\
    && apt-get install -y --no-install-recommends software-properties-common\
    && apt-add-repository contrib\
    && apt-get update

试试这个。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案6】:

对于目前在 docker 中看到此问题的基于 M1 的 Mac 上的用户 - libpg 上游似乎存在一个错误,该错误是针对 ARM 上的错误库版本构建的。

在修复之前,解决方法是(在性能受到影响时)只是run it via rosetta。

export DOCKER_DEFAULT_PLATFORM=linux/amd64,然后重新构建您的图像。

您将获得最新版本的 libpq,并且一切正常。

参考:https://issueexplorer.com/issue/psycopg/psycopg2/1360

【讨论】:

感谢您的提示。你的诊断是正确的。因为我使用 docker-compose 我选择使用这个答案 ***.com/a/69636473/80353 而不是 很好的解决方法,但我可以确认这现在适用于本机容器,使用 @ihm 在另一个答案中建议的 pyscopg2==2.9.3。【参考方案7】:

我在运行安装了psycopg2-binary==2.9.3python:3.9 docker 映像时遇到了这个问题。安装 psycopg2==2.9.3 反而为我解决了这个问题。

【讨论】:

这在 M1 /硅胶上为我解决了这个问题

以上是关于如何解决 Postgresql SCRAM 身份验证问题?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 将密码加密从 SCRAM 降级为 md5

MongoDB 客户端访问控制:SCRAM-SHA-1 身份验证失败,storedKey 不匹配

pgbouncer 和 scram-sha-256 设置

我用的是window server 2003系统, 管理工具 计算机管理中:无本地用户和组,如何调出?另用window 身份验...

pgpool-II使用问题之SCRAM方法错误

如何在 PostgreSQL 11.1 中将现有列更改为身份