如何解决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个回答

2

以下的 docker-compose 代码片段对我很有用:

command: postgres -c password_encryption=md5
environment:
  [...]
  POSTGRES_INITDB_ARGS: "--auth-local=md5"

你的回答可以通过添加更多支持信息来改善。请[编辑]以添加进一步的细节,例如引用或文档,以便其他人可以确认您的回答是正确的。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community

1

我曾经也遇到过这个问题,通过从二进制版本的 psycopg2 切换到 psycopg2 = "^2.9.3" 版本解决了它。


这对我有用,但我不需要固定版本,只需更改为非二进制包即可。 - Ryan McGrath

1

感谢之前的回答,我在这种情况下也解决了问题,当我从psycopg2-binary转换为psycopg2时。

在您的环境中使用pip install psycopg2。这将解决基于ubuntu的系统的问题。


0
这是一个更加平凡的答案,但这正是我所遇到的问题,因此我将在这里添加它。
当我尝试启动PostgreSQL 9.4时,出现了这个错误。我意识到我已经运行着PostgreSQL 11 - 它与我的计算机一起自动启动。一旦我停止了版本11,我就能够启动版本9.4。它们不能监听已经被占用的端口,并且两者都设置了相同的端口。但我不确定为什么会有误导性的错误措辞。

0
在安装Python3.10的Ubuntu 22.04镜像上的Mac M1上,遇到了问题。
对我有效的解决方法是以root身份安装psycopg2包,而不是使用--user选项 - 然后特定用户就可以使用该包。

看起来--user选项会将错误链接的libpq放在以下路径中:/home/<user...>/.local/lib/python3.10/site-packages/psycopg2_binary.libs/libpq-d97d8807.so.5.9

如果在执行此操作后,您还有另一个pip install --user进程,并且它在.local路径下再次安装了psycopg2,则只需从.local/lib/python3.x/site-packages/psycopg2*中删除即可。


0
  1. 使用vi(或其他编辑器)将postgresql.conf和post_hba.conf文件中的scram-sha-256替换为md5;文件位置取决于您的本地设置。完成此步骤1后,您可能仍然会遇到身份验证错误的问题。这是因为数据库中密码的哈希仍然使用scram加密。我们将在接下来的几个步骤中解决。
  2. 重新启动postgresql服务器。此命令也取决于您的服务器设置。
  3. 重新加载数据库并进行验证。使用postgres id登录:sudo -u postgres sql

重新加载(在psql控制台下):

SELECT pg_reload_conf();

检查加密:

SHOW password_encryption;
SELECT * FROM pg_hba_file_rules();
  • 重置用户帐户密码(在psql控制台中)。此步骤将为密码刷新一个新的md5哈希,以替换用户密码的现有scram哈希。

    \password user_id

  • 然后,您可以使用psycopg2以及sqlalchemy运行DB连接测试。

    这种方法解决了我的问题,我知道md5不如scram-sha-256理想的加密方法,但重新编译软件包以满足psycopg2的要求很麻烦。因此,我会先切换回md5,等软件包都准备好后再更改为scram加密。

    参考:PostgreSQL downgrade password encryption from SCRAM to md5


    0

    我是Mac OS上的php-fpm docker用户,无论是通过导出平台环境变量还是向dockerfile/docker-compose.yml中添加指令都没有成功。另外,将postgres切换到md5是我希望避免的解决方案。此外,在容器内使用apt-get会导致太多的依赖错误。对我而言有效的方法是将php-fpm升级到最新版本,重新构建容器,然后apt-get就会提供一个libpq >= 10的版本。

    实际上,我的dockerfile如下:

    FROM --platform=linux/amd64 php:7.4-fpm
    RUN apt-get update \
        && apt-get install -y \
            librabbitmq-dev \
            libssh-dev \
            libpq-dev  \
    ...
    

    -1
    我注意到使用新版 postgres 数据库的 Docker 镜像 - postgres:14.x-alpine 我遇到了这个错误。
    如果可行的话,您可以降级到一个旧的镜像,该镜像不具备这些额外的保护措施。
    version: '3.8'
    services:
    
    
      db:
        image: postgres:9-alpine
        restart: always
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        ports:
          - '5432:5432'
        volumes: 
          - db:/var/lib/postgresql/data
    

    -2
    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
    

    试一下这个。


    2
    目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

    -3

    遇到了相同的问题,并应用了@Laurenz Albe的修复程序,但是我会因为加密策略更改而在数据库用户上收到身份验证错误。

    因此,不要将scram-sha-256替换为md5,而是在pg_hba.conf中将其替换为trust


    10
    用“信任”替代需要认证的方式可以使你的PostgreSQL无需认证即可登录。我认为这是一种不好的做法。 - alramdein
    7
    不要这样做!"信任"身份验证会禁用身份验证。 - Jeff
    1
    我知道这不安全,但这是唯一对我有效的方法。(仍然不安全) - Thalinda Bandara

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