由于不支持身份验证类型10,无法连接到Postgres数据库。

72

我最近尝试了一下Postgres。在本地安装了它(PostgreSQL 13.0)。创建了一个Maven项目并使用了Spring Data JPA,效果很好。然而,当我尝试使用Gradle项目时,无法连接到数据库,一直出现以下错误:

org.postgresql.util.PSQLException: 不支持认证类型10。请检查是否已将pg_hba.conf文件配置为包括客户端的IP地址或子网,以及它是否使用驱动程序支持的认证方案。 at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:614) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:222) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.jdbc.PgConnection.(PgConnection.java:194) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.Driver.makeConnection(Driver.java:450) ~[postgresql-42.1.4.jar:42.1.4] at org.postgresql.Driver.connect(Driver.java:252) ~[postgresql-42.1.4.jar:42.1.4] at java.sql.DriverManager.getConnection(Unknown Source) [na:1.8.0_261] at java.sql.DriverManager.getConnection(Unknown Source) [na:1.8.0_261] at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:94) [postgresql-42.1.4.jar:42.1.4] at org.postgresql.ds.common.BaseDataSource.getConnection(BaseDataSource.java:79) [postgresql-42.1.4.jar:42.1.4]

我也尝试使用JDBCTemplate,但不起作用。

参考这篇文章修改了pg_hba.cfg文件,但也不起作用。

使用了已弃用的Lib - 也不起作用。

请为我提供解决此问题的方法。

我的代码和配置:

    @Configuration
    public class DataSourceConfig {
    
        
        @Bean
        public DriverManagerDataSource getDataSource() {
            DriverManagerDataSource dataSourceBuilder = new DriverManagerDataSource();
            dataSourceBuilder.setDriverClassName("org.postgresql.Driver");
            dataSourceBuilder.setUrl("jdbc:postgresql://localhost:5432/postgres");
            dataSourceBuilder.setUsername("postgres");
            dataSourceBuilder.setPassword("root");
            return dataSourceBuilder;
        }
        
    }



@Component
public class CustomerOrderJDBCTemplate implements CustomerOrderDao{
    
    private DataSource dataSource;
    
    private JdbcTemplate jdbcTemplateObject;

    @Autowired
    ApplicationContext context;
    
    public void setDataSource() {
        //Getting Bean by Class
        DriverManagerDataSource dataSource = context.getBean(DriverManagerDataSource.class);
        this.dataSource = dataSource;
        this.jdbcTemplateObject = new JdbcTemplate(this.dataSource);
    }

@Override
    public Customer create(Customer customer) {
        setDataSource();
        String sql = "insert into CustomerOrder (customerType, customerPayment) values (?, ?)";
        //jdbcTemplateObject.update(sql, customerOrder.getCustomerOrderType(), customerOrder.getCustomerOrderPayment());
        
        KeyHolder holder = new GeneratedKeyHolder();
        jdbcTemplateObject.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                ps.setString(1, customer.getType());
                ps.setString(2, customer.getPayment());
                return ps;
            }
        }, holder);

        long customerId = holder.getKey().longValue();
        customer.setCustomerID(customerOrderId);
        return customer;
        
    }

}

依赖项

implementation('org.springframework.boot:spring-boot-starter-web')
    compile("org.springframework.boot:spring-boot-devtools")
    compile(group: 'org.postgresql', name: 'postgresql', version: '42.1.4')
    compile("org.springdoc:springdoc-openapi-ui:1.4.1")
    compile("org.springframework:spring-jdbc:5.2.5.RELEASE")

password_encryption是这样设置的:

postgres=# show password_encryption;
 password_encryption
---------------------
 scram-sha-256
(1 row)

3
show password_encryption; 命令会返回密码加密的设置。如果该设置为 SCRAM-SHA-256,那么你将需要更新的 JDBC 驱动程序。 - user330315

是的。 postgres =#显示password_encryption; password_encryption

scram-sha-256 (1行)
- Tushar Banne
在我的情况下,解决 Docker 镜像中的这个问题的唯一方法是根据我的同事的建议降级 Postgres 版本。因此,我创建了一个新的容器,使用 PostgreSQL v13.2,并解决了这个问题。由于这是一个测试服务器,所以这个解决方案对我有效。 - rjose
20个回答

60

我通过以下步骤在PostgreSQL 13中解决了类似的问题:

  1. postgresql.conf中将password_encryption更改为md5
Windows: C:\Program Files\PostgreSQL\13\data\postgresql.conf
GNU/Linux:           /etc/postgresql/13/main/postgresql.conf

enter image description here

将 `pg_hba.conf` 中的 `scram-sha-256` 修改为 `md5`。
Windows: C:\Program Files\PostgreSQL\13\data\pg_hba.conf
GNU/Linux:           /etc/postgresql/13/main/pg_hba.conf
host    all             all             0.0.0.0/0               md5

enter image description here

3. 修改密码(此处使用md5格式恢复密码)。 示例:ALTER ROLE postgres WITH PASSWORD 'root'; 4. 如果您在非生产环境中工作,请确保在postgresql.conf中设置listen_addresses = '*'。

8
这会降低驱动程序的安全性。您可能想考虑升级JDBC驱动程序。 - Mark Rotteveel
1
在所描述的更改后,密码仍使用scram-sha-256加密创建... 有任何想法为什么会这样吗?谢谢。 - noamyg
2
不要忘记在 ALTER ROLE 语句的末尾加上 ;。花了我一段时间才意识到。 ;) - Tobias Grunwald
1
对我来说,我必须作为最后一步执行 ALTER USER,即 ALTER USER postgres WITH PASSWORD 'root'; - Saeb Amini
5
我强烈建议人们遵循这个答案,即将PostgreSQL JDBC驱动程序升级到42.2.0或更高版本。 - Mark Rotteveel
1
尽管最安全的建议是升级驱动程序,但当您无法升级驱动程序时(例如,您无法访问升级软件损坏),此答案非常有用(它有效!)。 - CarlosRuiz

50
根据维基,支持SCRAM-SHA-256加密的JDBC驱动程序版本为42.2.0或更高版本。在我的情况下,驱动程序版本是41.1.1。将其更改为42.2.0或更高版本即可解决该问题。

(Maven,pom.xml):

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

奇怪,我在42.2.8版本中也遇到了同样的问题... - Matthieu
4
完成了!将42.1.1升级到42.2.24。 - Gishu
1
Postgres jdbc驱动程序42.2.0中存在一个错误,最好使用更高版本。请查看以下链接: https://youtrack.jetbrains.com/issue/DBE-5833 - Dmitriy Fialkovskiy
1
对于Java 1.7,更新到42.2.25.jre7版本。 - Abel Matos
这帮助我在Intellij IDEA中连接到我的数据库。 - driversti
谢谢!我正在使用Dropwizard。尝试了一下,原始错误消失了,但是出现了另一个构建错误(在执行org.jooq:jooq-codegen-maven:3.18.5:generate时缺少一个必需的类);将版本更新为42.6.0(在撰写此评论时最新版本),构建成功了。 - praty

39

将您的pg_hba.conf文件放在目录C:\Program Files\PostgreSQL\13\data\pg_hba.conf中,
然后只需将“Method”列下的scram-sha-256更改为trust。

enter image description here

这对我有效!


4
这个解决方案对我也有效。+1 - Jayapriya Atheesan
这个解决方案对我在Kali 2022.2上尝试与Armitage本地连接有效。 - Steve Weaver

11

password_encryption 设置为 scram-sha-256(在v13中为默认值),即使 pg_hba.conf 中使用了 md5,您也会获得 scram-sha-256 认证。

现在你正在客户端使用旧版本的JDBC驱动程序,该版本不支持这种身份验证方法,尽管PostgreSQL在3年前推出了它。

您应该升级JDBC驱动程序。另一种选择是将 password_encryption 设置回 md5,但那样您就必须重新设置所有密码,并接受更低的安全性。


只是好奇..我如何使用Maven项目连接而不是Gradle项目。 - Tushar Banne
不,这与您在JDBC驱动程序上方运行的内容无关。 - Laurenz Albe
我在Maven项目中使用的驱动程序与上述相同(org.postgresql.Driver)。这就是为什么我在Gradle项目中也使用了相同的驱动程序。 - Tushar Banne
好的,升级两者的驱动程序。 - Laurenz Albe
3
升级驱动程序同样适用于我。 - Simon K.
2
这应该是被接受的答案,因为在pg_hba.conf中更改值只是一种解决方法,真正的解决方案是升级JDBC驱动程序版本以支持scram-sha-256。例如,版本8.1-404.jdbc不支持它,但版本42.2.19支持。 - Balu

6
<?xml version="1.0" encoding="UTF-8"?>

4.0.0

<groupId>org.example</groupId>
<artifactId>postgresJDBC</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <java.version>11</java.version>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.source>${java.version}</maven.compiler.source>
</properties>

<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.18</version>
    </dependency>
</dependencies>

如果您正在使用PostgreSQL 9.1+,则需要检查您的Maven依赖项是否符合上述要求。

关于Maven依赖项的更多信息,请参考此链接:如何在Maven中添加PostgreSQL驱动程序作为依赖项?


5

在pg_hba.conf中将METHOD更改为“trust”


不安全,绝对不适合在真实系统中持续使用,但是对于我的目的(临时测试而无需重新配置加密或用户密码),这是一个方便的解决方法! - Thomas W

4

如果你在 Docker 中遇到了困难,可以按照以下步骤进行操作:

  1. 首先:使用 -e POSTGRES_HOST_AUTH_METHOD=md5 命令运行容器 (文档)
docker run -e POSTGRES_HOST_AUTH_METHOD=md5 -e POSTGRES_PASSWORD=doesntmatter -p 5432:5432 --name CONTAINERNAME -d postgres
其次:允许使用其他答案中讨论的md5加密方式。
docker exec -ti -u postgres CONTAINERNAME bash -c "echo 'password_encryption=md5' >> /var/lib/postgresql/data/postgresql.conf"
第三步:重新启动容器。
docker restart CONTAINER NAME
第四步:您需要以md5格式重新创建postgres密码
docker exec -ti -u postgres CONTAINERNAME psql

alter role postgres with password 'THE-NEW-PASSWORD';

* 请注意,scram-sha-256 比 md5 更好(文档)


3

1
保持安全的最佳解决方案 - kyle england
这是最好的答案! 您应该遵守服务器的安全要求与您的客户端! 我只需要更改客户端的jar包,一切都顺利进行。 - MGM

2
对于我来说,更新postgres库有助于解决这个问题。

2
即使在所有地方将pg_hba.conf更改为MD5,它仍然无法工作。有效的方法是这样做:
show password_encryption;
如果它显示为scram-sha-256,请执行以下操作:
set password_encryption = 'md5';

重启服务器,这解决了我的问题。


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