致命:使用 Postgres13.3 和 SCRAM 身份验证的用户密码身份验证失败

问题描述 投票:0回答:1

我已经设置了一个 postgres:13.3 docker 容器和 scram-sha-256 身份验证。

最初,我跑:

docker run -d --name my-postgres13 -p 5432:5432 -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=fbp123 -e POSTGRES_DB=mydb -e POSTGRES_HOST_AUTH_METHOD=scram-sha-256 -v pgdata13:/var/lib/postgresql/data postgres:13.3

Postgres.conf:

password_encryption = scram-sha-256

pg_hba.conf:

hostnossl all all 0.0.0.0/0 scram-sha-256
local all all scram-sha-256

完成上述操作并重新启动容器后,我创建了一个新的 fbp2 用户并应用了密码“fbp123”,密码似乎保存为 pg_authid 表中的紧急停止:

 16386 | fbp2                      | t        | t          | f             | f           | t           | f              | f            |           -1 | SCRAM-SHA-256$4096:yw+jyaEzlvlOjZnc/L/flA==$tqPlJIDXv9zueaGd8KpQf11N82IGgAOsK4
Lhb7lPhi4=:+mCXFKb2y5PG6ycIKCz7xaY8U5MNLnkzlPZK8pt3to0= | 

我使用 java 应用程序中的原始纯文本进行连接:

hikariConfig = new HikariConfig();
hikariConfig.setUsername("fbp2");
hikariConfig.setPassword("fbp123");
hikariConfig.setJdbcUrl("jdbc:postgresql://%s:%s/%s".formatted("localhost", 5432, "mydb"));
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource.getConnection();

从日志中,使用此网址:

jdbc:postgresql://localhost:5432/mydb

问题是我遇到身份验证问题,尽管我使用在 postgres 服务器中使用的纯文本密码:

2024-03-30 14:38:03.372 DEBUG 22440 [           main] c.z.h.u.DriverDataSource                 : Loaded driver with class name org.postgresql.Driver for jdbcUrl=jdbc:postgresql://localhost:5432/mydb
2024-03-30 14:38:03.601 DEBUG 22440 [           main] c.z.h.p.PoolBase                         : HikariPool-1 - Failed to create/setup connection: FATAL: password authentication failed for user "fbp2"
2024-03-30 14:38:03.601 DEBUG 22440 [           main] c.z.h.p.HikariPool                       : HikariPool-1 - Cannot acquire connection from data source
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "fbp2"
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:693)
    at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:203)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:258)

请注意,如果我恢复为“信任”并且不发送密码,我会得到以下结果:

org.postgresql.util.PSQLException: The server requested SCRAM-based authentication, but no password was provided.

所以,看来服务器只想紧急撤离。我尝试过md5但没有成功。


一些相关依赖:

 <dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.3.0</version>
</dependency>

<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP</artifactId>
   <version>5.1.0</version>
 </dependency>

我的 docker 桌面在 Windows 11 上运行。 我使用 Oracle OpenJDK 20.0.1

我可以通过 psql 管理工具使用 fbp2 用户连接到 mydb,没有任何问题(在纯密码之后):

root@a00ccf79f08a:/# psql -h localhost -p 5432 -U fbp2 -d mydb
Password for user fbp2:
psql (13.3 (Debian 13.3-1.pgdg100+1))
Type "help" for help.

mydb=#

更新1

服务器日志(包括连接尝试):

2024-03-30 15:21:19.566 UTC [1] LOG:  starting PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2024-03-30 15:21:19.567 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2024-03-30 15:21:19.567 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2024-03-30 15:21:19.571 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2024-03-30 15:21:19.576 UTC [27] LOG:  database system was shut down at 2024-03-30 15:21:18 UTC
2024-03-30 15:21:19.582 UTC [1] LOG:  database system is ready to accept connections

更新2

结果 “mydb=# 从 pg_settings 中选择名称、设置、源、源文件,其中 name = 'password_encryption';”

mydb=# select name, setting, source, sourcefile from pg_settings where name = 'password_encryption';
        name         | setting | source  | sourcefile 
---------------------+---------+---------+------------
 password_encryption | md5     | default | 
(1 row)

更新3

/var/lib/postgresql/data/postgresql.conf:

#password_encryption = scram-sha-256        # md5 or scram-sha-256

我只看到一个 postgresql.conf 文件。为了重新加载更改,我做了:

mydb=# SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

mydb=#

还有 docker restart 容器。

java postgresql hikaricp
1个回答
0
投票

谢谢@jjanes 和阿德里安。这就是问题所在。我不知道以前本地安装了 postgres 14 和 16。我重新安装了它们,问题就解决了。

删除忘记的 postgres 安装后,我现在有以下问题并且问题已解决:

PS C:\Users ioan> netstat -aon |查找str“5432”

  TCP    0.0.0.0:5432           0.0.0.0:0              LISTENING       7828
  TCP    [::]:5432              [::]:0                 LISTENING       7828

之前,我有 4 行。 我似乎错误描述并不能帮助找到这里的原因。

© www.soinside.com 2019 - 2024. All rights reserved.