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

70

我将项目转移到生产环境后出现了错误。在使用生产服务器运行时,该错误如下:

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

以下是我的PostgreSQL版本:

开发版 :

PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit

生产版 :

PostgreSQL 11.5 (EnterpriseDB Advanced Server 11.5.12) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit


3
你可能在客户端计算机上使用了旧的libpq。 - user330315
@a_horse_with_no_name 是否存在重复的libpq文件? - Alimin
我已经通过运行select version()检查了开发PostgreSQL版本和生产服务器之间的两个版本,结果已在我的问题中发布。请仔细阅读我的问题,您将了解到两个版本都已安装。 - Alimin
2
您需要检查客户端(您运行代码的地方)的版本,而不是服务器的版本。 - user330315
1
生产服务器版本:(我运行程序的客户端) PostgreSQL 11.5(EnterpriseDB Advanced Server 11.5.12)在x86_64-pc-linux-gnu上,由gcc(GCC)4.8.5 20150623(Red Hat 4.8.5-36)编译,64位。 - Alimin
显示剩余3条评论
20个回答

93

针对目前在使用基于 M1 芯片的 Mac 电脑并且遇到 Docker 相关问题的用户 - 这似乎是由于 ARM 架构下的 libpg 模块构建时选用了错误的库版本。

在修复之前,可以采用一个变通方式(会带来一定性能损失),即通过 Rosetta 运行它。

export DOCKER_DEFAULT_PLATFORM=linux/amd64 并重新构建你的镜像。

这样你将获得最新版本的 libpq,所有事情都应该可以正常工作。

参考: https://github.com/psycopg/psycopg2/issues/1360


3
谢谢这个提示。你的诊断是正确的。虽然因为我使用docker-compose,所以我选择使用这个答案https://dev59.com/N1EG5IYBdhLWcg3wducf#69636473。 - Kim Stacks
3
不错的解决方法,但我可以确认现在在本机容器上使用pyscopg2==2.9.3是可行的,正如@ihm在另一个答案中建议的那样。 - thclark
2
这不仅会导致性能下降,而且如果您尝试运行比数据库更严重的任何内容,这将是不可接受的。 - One Full Time Equivalent
1
您也可以将Postgres Alpine-14降级到Alpine-13.3。对我来说,这样解决了问题 :) - Jorrick Sleijster
这个问题已经在 psycopg2 版本 2.9.6 中得到了解决,所以现在更新到该版本应该可以修复它。 :) - Daniel Hawkins
显示剩余2条评论

50
我在运行一个安装了 psycopg2-binary==2.9.3python:3.9 Docker镜像时,遇到了这个问题。但是,改成安装 psycopg2==2.9.3 后,问题得以解决。

3
这对我在 M1 / 硅解决了问题。 - seth
在裸的Ubuntu上有同样的问题,在生产环境中安装psycopg2而不是psycopg2-binary解决了它。 - Atem18
这应该是被接受的答案。如果您的容器中需要其他更加性能密集型的软件,那么在 Rosetta 上运行 M1 是不可接受的。 - One Full Time Equivalent
2
你在 Docker 容器中安装了 psycopg2-binary 2.9.3 吗?我在本地可以成功安装,但是构建 Docker 镜像时每次都失败。 - takecare
很棒的解决方案,在Docker和苹果M1上都适用。 - Swagat sahoo
显示剩余3条评论

47

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

该库的版本必须为9.6或更早版本,而SCRAM身份验证是在v10中引入的。

请在应用程序端升级libpq,然后重试。

如果您不需要scram-sha-256身份验证,则可以恢复为md5

  • postgresql.conf中设置password_encryption = md5
  • pg_hba.conf中将身份验证方法更改为md5
  • 重新加载PostgreSQL
  • 更改用户密码以获取MD5加密密码

4
你是否有相关教程的链接,可以帮助我将我的库升级到第10版? - Alimin
3
你是如何在客户端安装 libpq 的?可能你需要重复这些步骤来安装新版本。 - Laurenz Albe
2
如果它来自操作系统分发,也许您可以升级操作系统?不过从PostgreSQL网页安装软件包可能更容易。但是,您可能还需要一个与libpq链接的新版本模块。 - Laurenz Albe
2
或者您可以回归到“md5”。请查看我的详细答案。 - Laurenz Albe
2
@AlifRamdani 你可以使用EnterpriseDB提供的安装程序,或者从ZIP文件中获取libpq.dll及其依赖库。 - Laurenz Albe
显示剩余6条评论

27
对于Amazon Linux用户:

$ sudo yum install -y amazon-linux-extras

然后重新安装PostgreSQL客户端。
$ sudo amazon-linux-extras install postgresql10

然后主要部分是在我的情况下安装Python包(psycopg2),重新安装它

$ pip3 install --force-reinstall psycopg2==2.9.3

specification: python3.8.9


1
完美运行,谢谢!一个小备注:ppsycopg2==2.93 而不是 ppsycopg2==2.9.3 - costigator

23

以前我在运行 laravel 8 中的 php artisan migrate 时,会出现错误信息 SCRAM authentication requires libpq version 10 or above。后来我通过以下方法解决了这个问题:将身份验证方式从 scram-sha-256 改为 md5,然后 重置您的密码重新启动postgresql-x64-13服务。下面是具体步骤:

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

13
第四步,请记得在行末添加 ";"。这个问题让我花了半天时间才解决。如果运行成功,psql窗口会返回"ALTER ROLE"。 - Helene
1
另外,我发现根据不同的机器,在第三步实际上需要使用不同的密码,并且在第五步需要重新启动计算机。 - Helene

7

这个问题仍然影响运行在 python:3.10.* docker 容器上的 m1 macs(基于 aarch64 Debian 11)。我的解决方案是安装来源于源代码构建的 psycopg2(无论如何,推荐用于生产环境)而不是 psycopg2-binary

pip install psycopg2

Python容器中已经包含了构建依赖项(如gcc)。更适合生产的容器很可能没有这些依赖项。https://www.psycopg.org/docs/install.html#build-prerequisites


6

如果您想保持 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 install postgresql13

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


这对我有效,顺便说一下,现在是postgresql14。yum安装postgresql14。 - Rick
这在CentOS 7上运行成功。 - undefined

5

基于 @meijsermans 的回答,我更改了 Django 的 requirements.txt 文件:

#psycopg2-binary>=2.9.3
psycopg2>=2.9.5

结果成功了,没有SCRAM错误!

尝试过在docker.compose中加入和不加入platform: linux/arm64,但都没有解决问题。
尝试使用platform: linux/amd64,但出现了一些无关的错误(主要是“exec /bin/sh: exec format error”)。
在postgres容器中使用postgres:14.5镜像,在django中使用python:3.10.7镜像。


这并不能真正回答问题。如果您有不同的问题,可以通过单击提问来提出。如果该问题有新的答案,您可以关注此问题以获取通知。一旦您拥有足够的声望,您也可以添加悬赏以吸引更多关注此问题的人。- [来自评论审核] (/ review / late-answers / 33444842) - mousetail
目前您的回答写得不够清晰,请[编辑]并添加额外细节,以帮助其他人了解它如何回答所提出的问题。您可以在帮助中心找到更多有关撰写良好答案的信息。 - Community

3
我找到了2个解决方案。我没有尝试本地的解决方案,这些解决方案适用于docker容器。
初步信息: 根据我们在Dockerfile开头定义的主要镜像,我们的libq版本可能会有所不同。这在这里给出的示例中进行了解释。
如果你想知道你的docker-image中使用的libq版本,可以按照以下步骤操作。
1. 在docker-compose运行后 docker-compose exec sh python import psycopg2 print(psycopg2.extensions.libpq_version())
如果你遇到错误,你可能会看到一个类似于90xxx的数字。
解决方案:
  • 第一个基本解决方法是,在Docker中使用了'python:3.9-slim-buster',但出现了错误。将基础镜像名称更改为'python:3.9.6-alpine3.14'
  • 第二个解决方案是构建psycopg2文件并安装libq和其他依赖项。 为此, 在dockerfile中添加以下命令。

RUN apt update -y && apt install -y build-essential libpq-dev

RUN pip3 install psycopg2-binary --no-binary psycopg2-binary


2
所有建议将密码加密恢复为md5的答案都忘记了PostgreSQL出于安全原因将其默认密码加密从md5更改为scram-sha-256。问题在于那些无法使用这种现代加密方法的客户端应用程序。随PostgreSQL版本10及以上版本一起提供的libpq文件很好。如果可以,请更改您的客户端应用程序,以便仅使用支持此新方法的应用程序。

例如,我长期使用一个名为RPostgreSQL的包,该包允许用户从R连接到PostgreSQL数据库。结果发现该包不支持scram-sha-256。我现在已经将其替换为其现代等效物rpostgres。问题解决了,大家都高兴!

1
感谢分享解决方案,对我很有效,使用了这个包(rpostgres)。干杯! - André WZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接