Соединение Openliberty PostgreDB с sslMode=проверка-сбой центра сертификации

#postgresql #ssl #open-liberty

Вопрос:

я пытаюсь подключить свой сервер Openliberty к PostgreDB с более высоким sslMode, чем просто «требуется». Вот это server.xml :

 <featureManager>
    <feature>jaxrs-2.1</feature>
    <feature>mpHealth-2.1</feature>
    <feature>ejbLite-3.2</feature>
    <feature>beanValidation-2.0</feature>
    <feature>concurrent-1.0</feature>
    <feature>mpConfig-1.3</feature>
    <feature>jpa-2.2</feature>
    <feature>transportSecurity-1.0</feature>
    <feature>jdbc-4.2</feature>
</featureManager>

...

<sslDefault sslRef="defaultSsl"/>
<ssl id="defaultSsl" trustStoreRef="defaultTrustStore"/>
<keyStore id="defaultTrustStore" location="postgre_store.jks" password="changeit"/>

<library id="postgresql-driver-library">
    <fileset dir="${shared.resource.dir}/postgresql" id="postgresql-driver-fileset" includes="*.jar"/>
</library>

<jdbcDriver id="postgresql-driver" javax.sql.XADataSource="org.postgresql.xa.PGXADataSource"
            javax.sql.ConnectionPoolDataSource="org.postgresql.ds.PGConnectionPoolDataSource"
            libraryRef="postgresql-driver-library"/>

<dataSource id="some-db" jndiName="jdbc/mydb" jdbcDriverRef="postgresql-driver"
            type="javax.sql.ConnectionPoolDataSource" transactional="true">
    <properties serverName="${datasource.servername}"
                portNumber="${datasource.port}"
                databaseName="${datasource.database}"
                user="${datasource.username}"
                password="${datasource.password}"
                ssl="true"
                loggerLevel="DEBUG"
                sslMode="verify-ca"
                sslFactory="org.postgresql.ssl.DefaultJavaSSLFactory"/>
</dataSource>
 

Хранилище доверия находится в той же папке, server.xml что и . При запуске сервера я получаю следующую ошибку, как только Flyway пытается подключиться к PostgreDB:

 [INFO] SQL State  : 08006
[INFO] Error Code : 0
[INFO] Message    : SSL error: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path 
to requested target DSRA0010E: SQL-Status = 08006, Errorcode = 0
[INFO]
[INFO]  at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:60)
[INFO]  at 
org.flywaydb.core.internal.database.DatabaseFactory.createDatabase(DatabaseFactory.java:72)
[INFO]  at org.flywaydb.core.Flyway.execute(Flyway.java:1670)
[INFO]  at org.flywaydb.core.Flyway.info(Flyway.java:1521)
 

Я добавил корневой сертификат (который является самозаверяющим) во вновь созданное хранилище доверия, как описано здесь: https://jdbc.postgresql.org/documentation/head/ssl-client.html
а также преобразовал его из .cer в .crt.der (хотя я не уверен, имеет ли это значение). Как я могу быть уверен, что предоставленный truststore распознан и используется jdbc? Правильно ли мое предположение, что sslRootCert атрибут внутри <properties> тега также должен указывать на общедоступный, доверенный корневой сертификат, который использовался для создания сертификата на стороне сервера Postgre (сервер, к которому я хочу подключиться)?

Версия Openliberty: 21.0.0.3

артефакт драйвера postgre-это:

 <groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.14</version>
 

Есть какие-нибудь идеи о том, почему соединение может не работать?

Ответ №1:

Я думаю, что проблема здесь в том, что вы пытаетесь использовать как фабрику SSL драйверов, так и собственную фабрику SSL java.

Когда вы устанавливаете sslFactory="org.postgresql.ssl.DefaultJavaSSLFactory" , вы говорите водителю игнорировать sslRootCert и вместо этого ожидать, что он найдет сертификат в собственном хранилище доверия java.

Вы можете сделать одно из следующих действий, чтобы исправить это:

  1. Добавьте свой корневой сертификат в хранилище доверия.
  2. Добавьте свой закрытый ключ в свой или свой закрытый ключ в драйвер и удалите собственную фабрику Java SSL
  • ДОБАВИТЬ: sslKey=»${server.config.dir}/postgre_store.jks»
  • УДАЛИТЬ: sslFactory=»org.postgresql.ssl.DefaultJavaSSLFactory»

Чтобы отладить это, вы должны запустить следующее свойство JVM -Djavax.net.debug=all и посмотреть на вывод. Доверенные сертификаты, которые драйвер пытается проверить, будут перечислены в разделе:

 javax.net.ssl|DEBUG|35|Default Executor-thread-3|X509TrustManagerImpl.java:79|adding as trusted certificates (
  "certificate" : {
    "version"            : "v3",
    "serial number"      : "1C 3D 0F 3E",
    "signature algorithm": "SHA256withRSA",
 

Вот полезный блог, в котором более подробно рассматривается конфигурация SSL в liberty : https://openliberty.io/blog/2021/06/04/database-ssl-primer.html

Ответ №2:

Настройка подключения была правильной, проблема в данном случае заключалась в неправильной настройке сервера PostgreSQL.