【问题标题】:How to Connect to PostgreSQL with SSL in Quarkus如何在 Quarkus 中使用 SSL 连接到 PostgreSQL
【发布时间】:2023-02-02 07:38:58
【问题描述】:

我有一个基于 quarkus 的应用程序。它需要使用 SSL 连接到数据库。我已经指定配置如下:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.reactive.url=postgresql://ipaddress:5432/dbname?sslmode=verify-ca
quarkus.datasource.password=password
quarkus.datasource.username=username
quarkus.datasource.reactive.postgresql.ssl-mode=require
quarkus.datasource.reactive.trust-certificate-pem=true
quarkus.datasource.reactive.trust-certificate-pem.certs=certificates/cacertificate.pem,certificates/client.pem
quarkus.datasource.reactive.key-certificate-pem=true
quarkus.datasource.reactive.key-certificate-pem.keys=certificates/private_key.pem
quarkus.datasource.reactive.trust-all=true

但是,我收到以下错误:

io.vertx.core.VertxException: io.vertx.core.VertxException: Missing X.509 certificate
        at io.vertx.core.net.impl.SSLHelper.createContext(SSLHelper.java:336)
        at io.vertx.core.net.impl.SSLHelper.getContext(SSLHelper.java:511)
        at io.vertx.core.net.impl.SSLHelper.createEngine(SSLHelper.java:547)
        at io.vertx.core.net.impl.NetSocketImpl.upgradeToSsl(NetSocketImpl.java:307)
        at io.vertx.core.net.impl.NetSocketImpl.upgradeToSsl(NetSocketImpl.java:291)
        at io.vertx.pgclient.impl.InitiateSslHandler.channelRead(InitiateSslHandler.java:73)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:792)
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:475)
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:750)
Caused by: io.vertx.core.VertxException: Missing X.509 certificate
        at io.vertx.core.net.impl.KeyStoreHelper.loadKeyCert(KeyStoreHelper.java:231)
        at io.vertx.core.net.PemKeyCertOptions.getHelper(PemKeyCertOptions.java:447)
        at io.vertx.core.net.PemKeyCertOptions.getKeyManagerFactory(PemKeyCertOptions.java:465)
        at io.vertx.core.net.impl.SSLHelper.getKeyMgrFactory(SSLHelper.java:341)
        at io.vertx.core.net.impl.SSLHelper.createContext(SSLHelper.java:286)

我做错了吗?在 Quarkus 中使用 SSL 连接到数据库的正确方法是什么?

我在 Quarkus 主页上找不到任何示例。

我已确保指定目录中的证书和密钥文件(pem 格式)可用。我不确定如何告诉我的 Quarkus 应用程序要使用哪个 cacertificate 和客户端证书,因为配置名称非常通用。我希望数据库仅通过设置该配置来连接,并且不应添加更多代码,因为连接由 Quarkus 处理。

【问题讨论】:

    标签: java postgresql database-connection quarkus


    【解决方案1】:
        quarkus.datasource.url=jdbc:postgresql://host:port/database?ssl=true&sslmode=require
    quarkus.datasource.driver=org.postgresql.Driver
    quarkus.datasource.username=username
    quarkus.datasource.password=password
    
    # SSL configuration
    quarkus.datasource.ssl-mode=require
    quarkus.datasource.ssl-factory=org.postgresql.ssl.NonValidatingFactory
    quarkus.datasource.ssl-factory-arg=trustStorePath=/path/to/truststore.jks,trustStorePassword=password
    

    要在 Quarkus 中使用 SSL 连接到数据库,您可以在 application.properties 文件中配置数据库的连接属性。您将需要提供必要的 SSL 属性,例如信任库和密钥库的位置,以及这些文件的密码。

    错误消息表明缺少 X.509 证书。要解决此问题,请确保属性 quarkus.datasource.reactive.trust-certificate-pem.certs 和 quarkus.datasource.reactive.key-certificate-pem.keys 中证书文件的路径正确,并且文件可在这些位置访问。检查文件是否包含正确的 PEM 格式证书也很重要。此外,值得仔细检查证书文件的格式是否正确以及是否与预期的 CA 和客户端证书相匹配。

    【讨论】:

    • 我已将连接属性放在外部文件属性中(在云上)。这工作正常,可以使用此方法访问所有其他配置。我在 quarkus 参考指南 (quarkus.io/guides/datasource) 上找不到 ssl-factory 属性。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2014-09-25
    • 2023-01-29
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多