如何解决 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 = md5
将pg_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 password
和restart 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.3
的python:3.9
docker 映像时遇到了这个问题。安装 psycopg2==2.9.3
反而为我解决了这个问题。
【讨论】:
这在 M1 /硅胶上为我解决了这个问题以上是关于如何解决 Postgresql SCRAM 身份验证问题?的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 将密码加密从 SCRAM 降级为 md5
MongoDB 客户端访问控制:SCRAM-SHA-1 身份验证失败,storedKey 不匹配
我用的是window server 2003系统, 管理工具 计算机管理中:无本地用户和组,如何调出?另用window 身份验...