java Sping Boot 通过SSL连接到PostgreSQL

iovurdzv  于 2023-05-21  发布在  Java
关注(0)|答案(4)|浏览(521)

我有一个Sping Boot 应用程序(版本2.1.1),使用PostgreSQL 9.6作为数据库。我必须使用sslmode=verify-ca通过SSL连接到数据库。到目前为止,我所做的是在www.example.com文件中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`

有没有办法在其他spring属性中指定ssl属性,而不是在连接url中指定?
此外,还可以为证书指定相对路径,而不是使用绝对路径?

ui7jx7zq

ui7jx7zq1#

我在src/main/resources中使用了一个证书的相对路径,效果很好:

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

URL似乎是指定这些参数的唯一位置。你也可以使用环境变量进行插值。

gwbalxhn

gwbalxhn2#

我无法让它与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
f4t66c6m

f4t66c6m3#

如果您使用的是GCP,请按照下面的过程连接cloudsql-postgres和spring Boot 。
我能解决它。
在云中创建数据库并创建客户端证书。
1.应在GCP DB中配置“仅允许SSL连接”。

  1. GCP为您提供了3件事客户端-证书.pem客户端-密钥.pem服务器-ca.pem
    1.必须使用以下命令将客户端密钥转换为pk 8:sudo openssl pkcs8 -topk8 -inform PEM -outform DER -in client-key.pem -out client-key.pk8 -nocrypt
    1.这些文件必须保存在运行TB的服务器中的某个地方,我使用的文件夹是/root/pgcerts/,因为我已经在使用它做其他事情(这个文件夹是我创建的)
    1.必须给予特权:chmod o+r /root/pgcerts/client-key.pk8
    在文件application.properties的POSTGRESQL部分中,必须使用以下信息。
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
tvokkenx

tvokkenx4#

如果你使用的是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。

相关问题