Подключение Spring Boot к Postgresql по SSL

У меня есть приложение Spring Boot (версия 2.1.1), использующее Postgresql 9.6 в качестве базы данных. Я должен подключиться к БД через SSL с sslmode=verify-ca, То, что я сделал до сих пор, это установил в файле Application.properties свойство

spring.datasource.url=jdbc:postgresql://`url`:`port`/`db`?
    ssl=true&
    sslmode=verify-ca&
    sslcert=`path_to_client_cert`&
    sslkey=`path_to_client_key`&
    sslrootcert=`path_to_ca_cert`

Есть ли способ указать свойства ssl в некоторых других свойствах Spring, а не в URL-адресе соединения?

Также есть возможность указывать относительные пути для сертификатов вместо использования абсолютных путей?

4 ответа

Я использовал относительный путь для сертификата, который я поместил в src/main/resources и это сработало нормально:

jdbc:postgresql://db_host:db_port/db_name?
    sslmode=require&
    sslrootcert=`my_root_certificate.crt`

Похоже, что URL-адрес - единственное место, где можно указать эти параметры. Вы также можете выполнить интерполяцию с переменными среды.

Мне не удалось заставить его работать с org.postgresql.ssl.NonValidatingFactory

Я добавил ?sslmode=verify-full до конца строки подключения.

По умолчанию он будет использовать org.postgresql.ssl.LibPQFactory

По умолчанию он будет искать сертификаты в $HOME/.postgresql/ следующее:

org.postgresql.PGProperty.SSL_ROOT_CERT; root.crt
org.postgresql.PGProperty.SSL_CERT; postgresql.crt
org.postgresql.PGProperty.SSL_KEY; postgresql.pk8

Чтобы преобразовать ваш закрытый ключ в формат pk8:

openssl pkcs8 -topk8 -inform PEM -outform DER -in postgresql.key -out postgresql.pk8 -nocrypt

Если вы используете Hikari, вы можете установить такие свойства:

      spring.datasource:
  url: jdbc:postgresql://host:port/db
  hikari.data-source-properties:
    ssl: true
    sslmode: verify-ca
    sslcert: path_to_client_cert
    sslkey: path_to_client_key
    sslrootcert: path_to_ca_cert

Относительные пути будут работать. Значение просто передаетсяnew FileInputStream(String).

Если вам нужно что-то более сложное, например загрузка ресурсов пути к классам, вам нужно будет предоставить собственный (или просто другой)sslfactory.

Например,org.postgresql.ssl.SingleCertValidatingFactoryподдерживаетclasspath:URL-адрес.

Если вы используете GCP, выполните описанный ниже процесс, чтобы подключить cloudsql-postgres к весенней загрузке.

Я смог решить это.

Создайте БД в облаке и создайте клиентские сертификаты.

  1. Разрешить только SSL-соединения» следует настроить в базе данных GCP.

  2. GCP предоставляет вам 3 вещи client-cert.pem client-key.pem server-ca.pem

  3. Ключ клиента необходимо преобразовать в pk8 с помощью следующей команды:sudo openssl pkcs8 -topk8 -inform PEM -outform DER -in client-key.pem -out client-key.pk8 -nocrypt

  4. Эти файлы должны быть сохранены где-то на сервере, на котором работает ТБ, папка, которую я использовал, была/root/pgcerts/так как я уже использовал его для чего-то другого (Эта папка была создана мной)

  5. Должны быть предоставлены привилегии:chmod o+r /root/pgcerts/client-key.pk8

В разделе POSTGRESQL в файлеapplication.propertiesнеобходимо использовать следующую информацию.


      database=postgresql
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.database-platform= org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.show-sql= true
spring.datasource.username= <username>
spring.datasource.password= <password>
spring.sql.init.mode=always
spring.datasource.url= jdbc:postgresql://DATABASEIP:5432/postgres?sslmode=require&sslrootcert=/root/pgcerts/server-ca.pem&sslcert=/root/pgcerts/client-cert.pem&sslkey=/root/pgcerts/client-key.pk8
Другие вопросы по тегам