@jenya7771

Как подключится к postgresql с использованием TLS сертификата из приложения на java?

Здравствуйте, есть приложение на java spring boot, которое должно подключится через приватную сеть с использованиям tls сертификата к базе postgresql на другом сервере.
Сертификаты все самоподписные которые сделаны вот этими командами:
как генерировал сертификаты

openssl req -sha256 -new -x509 -days 5475 -nodes -out server-ca.crt -keyout server-ca.key
openssl req -sha256 -new -nodes -subj "/CN=10.0.0.3" -out server.csr -keyout server.key
openssl x509 -req -sha256 -days 5475 -in server.csr -CA server-ca.crt -CAkey server-ca.key -CAcreateserial -out server.crt

openssl req -sha256 -new -x509 -days 5475 -nodes -out client-ca.crt -keyout client-ca.key
openssl req -sha256 -new -nodes -subj "/CN=application" -out client.csr -keyout client.key
openssl x509 -req -sha256 -days 5475 -in client.csr -CA client-ca.crt -CAkey client-ca.key -CAcreateserial -out client.crt



Затем из корневого сертификата клиента и подписанного им сертификата, я создал новый:
как собирал сертификат клиента

cat client-ca.key client.crt > client.full.crt


И добавиляю сертификаты в trustStore:
как добавлял сертификаты в trustStore

keytool -keystore cacerts -alias client-full-crt -import -file client.full.crt
keytool -keystore cacerts -alias postgresql-server-crt -import -file server-ca.crt



client.key преобразовываю в client.pk8 исходя из документации:
как создавал ключ в формате pk8

openssl pkcs8 -topk8 -inform PEM -in client.key -outform DER -out client.pk8 -v1 PBE-MD5-DES



В application.properties прописываю конфиг:
app конфиг

spring.datasource.url=jdbc:postgresql://10.0.0.3:5432/application?ssl=true&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory&sslmode=verify-full&sslcert=/etc/ssl/postgres-client/client.crt&sslkey=/etc/ssl/postgres-client/client.pk8&sslrootcert=/etc/ssl/postgres-client/server-ca.crt

spring.datasource.username=application



И запускаю:
start app

java -Djavax.net.ssl.trustStore=cacerts -Djavax.net.ssl.trustStorePassword=changeit -jar backend.jar --spring.config.location=application.properties



И при запуске ошибка:
61ec5e6d8f3d8919929769.png

А со стороны Postgres:
2022-01-22 19:25:34.344 UTC [324199] [unknown]@[unknown] LOG:  could not accept SSL connection: sslv3 alert certificate unknown


Хотя когда я пытаюсь подключится через psql все отлично подключается:
тест через psql

psql "host=10.0.0.3 \
      user=application \
      dbname=application \
      sslmode=verify-full \
      sslrootcert=/etc/ssl/postgres-client/server-ca.crt \
      sslcert=/etc/ssl/postgres-client/client.crt \
      sslkey=/etc/ssl/postgres-client/client.key"



Так же когда без использования сертификата подключаюсь тоже работает отлично.

И спустя кучи часов работы и изучения пары десятков статей не смог решить эту проблему.
Подскажите, что не так, в чем проблема?
  • Вопрос задан
  • 1752 просмотра
Пригласить эксперта
Ответы на вопрос 1
@freedom1b2830
1:
попробуйте добавить все сертификаты по цепочке доверия

2:
добавляем сертификаты в java
https://stackoverflow.com/questions/2893819/accept...

File crtFile = new File("server.crt");
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(crtFile));
CertificateFactory.getInstance("X.509").generateCertificate(this.class.getClassLoader().getResourceAsStream("server.crt"));

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

подключаемся к бд с connection source С ssl=true и другими нужными параметрами
https://jdbc.postgresql.org/documentation/head/con...
https://jdbc.postgresql.org/documentation/head/ssl...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы