Подключение 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 к весенней загрузке.
Я смог решить это.
Создайте БД в облаке и создайте клиентские сертификаты.
Разрешить только SSL-соединения» следует настроить в базе данных GCP.
GCP предоставляет вам 3 вещи client-cert.pem client-key.pem server-ca.pem
Ключ клиента необходимо преобразовать в pk8 с помощью следующей команды:
sudo openssl pkcs8 -topk8 -inform PEM -outform DER -in client-key.pem -out client-key.pk8 -nocrypt
Эти файлы должны быть сохранены где-то на сервере, на котором работает ТБ, папка, которую я использовал, была
/root/pgcerts/
так как я уже использовал его для чего-то другого (Эта папка была создана мной)Должны быть предоставлены привилегии:
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