Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为Play Framework配置HikariCP以通过SSL连接到Postgres?_Postgresql_Scala_Ssl_Playframework_Hikaricp - Fatal编程技术网

Postgresql 为Play Framework配置HikariCP以通过SSL连接到Postgres?

Postgresql 为Play Framework配置HikariCP以通过SSL连接到Postgres?,postgresql,scala,ssl,playframework,hikaricp,Postgresql,Scala,Ssl,Playframework,Hikaricp,我试图让Play框架通过SSL连接到Postgres数据库。SSL在Postgres上配置了LetsEncrypt 如果没有SSL,Play连接到数据库就没有问题。但是有了它,我得到了一个错误: java.io.FileNotFoundException: /home/mainuser/.postgresql/root.crt (No such file or directory) 我需要提到的是,证书文件放在目录/etc/postgresql/13/main/下。到数据库的ssl连接在本地和

我试图让Play框架通过SSL连接到Postgres数据库。SSL在Postgres上配置了LetsEncrypt

如果没有SSL,Play连接到数据库就没有问题。但是有了它,我得到了一个错误:

java.io.FileNotFoundException: /home/mainuser/.postgresql/root.crt (No such file or directory)
我需要提到的是,证书文件放在目录
/etc/postgresql/13/main/
下。到数据库的ssl连接在本地和远程外场都可以正常工作

当前的
application.conf
包括:

db.default.driver=org.postgresql.Driver
db.default.url="jdbc:postgresql://localhost/my_db?ssl=on"
db.default.username=${?DATABASE_USER}
db.default.password=${?DATABASE_PASSWORD}
db.default.hikaricp.connectionTestQuery = "SELECT 1"


fixedConnectionPool = 5

database.dispatcher {
  executor = "thread-pool-executor"
  throughput = 1
  thread-pool-executor {
    fixed-pool-size = ${fixedConnectionPool}
  }
}

我希望能够通过SSL本地和远程连接到此数据库。官方文件


如果您有任何建议,我们将不胜感激。

您可能希望设置PostgreSQL JDBC驱动程序的
sslrootcert
变量,以便更改证书的位置。我引用《驾驶手册》:

sslrootcert=字符串

SSL根证书的文件名。默认为defaultdir/root.crt 其中defaultdir是${user.home}/.postgresql/in*nix系统和 %windows上的appdata%/postgresql/

它可以是PEM编码的X509v3证书

有关,
https://jdbc.postgresql.org/documentation/head/connect.html
。虽然我还没有尝试过,但您应该能够将它作为进一步的参数添加到JDBC连接字符串中,
db.default.url
,如

db.default.url="jdbc:postgresql://localhost/my_db?ssl=on&sslrootcert=/new/path/cert"

如果它的
application.conf
设置不明显或不存在。

似乎Java进程无法访问您的
root.crt
,您是否检查了权限?@GaëlJ该文件首先不存在。为什么博士后要尝试访问它?
.crt
文件放在
/etc/postgresql/13/main
下,客户端也需要一个crt文件。一般来说,它将位于不同的位置。如果您的客户机和服务器正在共享crt文件,它们可能已经相互信任了,那么为什么要首先使用ssl呢?如果您希望客户端在其自定义位置以外的其他位置使用一个,那么您需要告诉它这样做。@jjanes感谢您提到这一点。播放框架未在SSL上运行。它是在apache2上运行的,它依赖于通过apache2的通信加密。但实际上,应该访问数据库的是Play本身。在远程客户端上,还会有Akka应用程序访问Postgres数据库。有什么建议吗?该文件应该归
postgres
所有吗?我从下载了letsencrypt的
.pem
根证书,然后将其转换为
.crt
,然后将其放在
${user.home}/.postgresql/
目录下,并将路径添加到
application.conf
。现在,我得到错误:
sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效认证路径
。我怀疑这可能是因为该文件应该由
Play
而不是
postgres
访问,我怀疑这可能是因为该文件应该由
Play
而不是
postgres
访问;然而,在将所有权返还给
main用户之后,什么也没有改变。我不确定现在的问题是什么。我可能会首先尝试让文件世界可读,看看它是否能以这种方式工作。然后我会把它限制在真正需要的范围内。毕竟,这不是私钥,而是证书,很可能是不敏感的,或者你不会选择letsencrypt,我想。所以,用这种方式缩小范围是没有坏处的。非常感谢你的建议。我担心它会被替换或重写。问题似乎不是权限问题。最终解决ssl问题的方法是向url添加
sslmode=require
。现在的问题是拒绝来自
pg_hba.conf
的连接,我认为这与这个问题无关。您可以编辑答案并将其包括在内。那我就可以接受答案了。