postgres r2dbc выдает ошибку ssl, но подключается с использованием jpa

#postgresql #spring-boot #ssl #spring-data-r2dbc #r2dbc-postgresql

#postgresql #весенняя загрузка #ssl #spring-data-r2dbc #r2dbc-postgresql

Вопрос:

конфигурация r2dbc:

 spring:
  profiles: default   r2dbc:
  url: r2dbc:postgresql://testserver.dev.net:1234/test?ssl=trueamp;sslmode=require
  username: test
  password: test
  connection_timeout: 20000
 

конфигурация jpa:

 spring:
profiles: default
  datasource:
    url: jdbc:postgresql://testserver.dev.net:1234/test?ssl=trueamp;sslmode=require
    username: test
    password: test
    hikari:
        connectionTimeout: 20000
        maximumPoolSize: 5
 

Соединение jpa работает нормально и возвращает результаты, r2dbc не удается подключиться к серверу, не удается найти действительный сертификат

Вызвано: sun.security.validator.Исключение ValidatorException: ошибка построения пути PKIX: sun.security.provider.certpath.Исключение SunCertPathBuilderException: не удается найти действительный путь сертификации к запрошенной цели

при отключенном r2dbc и ssl в файле pg_hba.conf нет записи для хоста. Почему он запрашивает сертификат только с конфигурацией r2dbc.

зависимости с r2dbc:

 <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-r2dbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency> <dependency>
        <groupId>io.r2dbc</groupId>
        <artifactId>r2dbc-postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
 

с jpa я использую spring web starter и jpa starter, оба являются spring версии 2.4.1.
Я застрял в этом, не могу найти причину этой ошибки. Любые решения приветствуются.

Ответ №1:

Вам необходимо изменить параметр «sslmode» в URL-адресе r2dbc на «sslMode». Похоже, что R2dbc по умолчанию использует sslmode как «verify-full», если вы не передаете sslMode в качестве параметра, и именно поэтому вы видите исключения, что он не может найти сертификат.

Ответ №2:

Если у вас есть все сертификаты, вот конфигурация, которую вы можете использовать, она сработала для меня. Убедитесь, что сертификаты находятся в папке ресурсов, и они должны быть только в формате pem.

 spring:
  config:
    activate:
      on-profile: dev
  r2dbc:
    url: r2dbc:pool:postgresql://<DB_HOST>:<DB_PORT>/<DB_NAME>
    username: <DB_USER>
    password: <DB_PASSWORD>
    properties:
      ssl: true
      sslMode: VERIFY_CA
      sslRootCert: root.pem
      sslCert: server.pem
      sslKey: key.pem