我在 PostgreSQL 数据库上启用了 SSL,并使用pg_hba.conf以下行强制执行它:

hostssl all all 0.0.0.0/0 md5

从 PostgreSQL 连接日志和通过 tcpdump 捕获的网络流量来看,似乎正在建立 SSL 连接:

2024-10-20 10:12:16.140 UTC [63] LOG:  connection authenticated: identity="user" method=md5 (/etc/postgresql/pg_hba.conf:136)
2024-10-20 10:12:16.140 UTC [63] LOG:  connection authorized: user=user database=db SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256)

然而,由于 Dovecot 和 PostgreSQL 运行在不同的机器上,并且证书及其 CA 在 Dovecot 机器上不受信任,我预计连接到 PostgreSQL 的 Dovecot 会标记自签名证书的问题,但没有出现任何投诉。这让我相信证书没有得到适当的验证,使连接容易受到 MITM(中间人)等攻击。

我是否缺少额外的配置或步骤来强制执行证书验证?如何确保连接安全并且证书得到正确验证?

5

  • 您期望自签名证书进行什么“验证”?另外,您是否尝试过建立常规未加密连接?如果强制加密,则应拒绝建立连接。


    – 

  • 另外:运行 Dovecot 的系统可能是该物理机器上生成的证书的受信任 CA。PostgreSQL 是否与 Dovecot 在同一台机器上运行?如果您将 Dovecot 指向另一台机器上的 PostgreSQL 服务器,它会报错吗?


    – 

  • 1
    @GregAskew 我预计 Dov​​ecot 会抱怨证书是自签名的或不受系统信任,除非我明确配置 Dovecot 信任该证书,否则它会触发警告或拒绝。在我启用 PostgreSQL 上的 SSL 后,Dovecot 会自动开始建立加密连接,而无需我进行任何进一步的更改。我担心的是,它接受了自签名证书而没有引起任何问题,这让我怀疑是否进行了正确的证书验证。


    – 

  • @tsc_chazz Dovecot 和 PostgreSQL 在不同的机器上运行。证书及其 CA 在 dovecot 机器上不受信任。


    – 


  • 在将其配置为强制执行 TLS 之前,我希望未加密的连接能够成功。


    – 


最佳答案
1

这是客户端配置问题,PostgreSQL 支持的客户端库称为libpq,Dovecot 正在使用它。相关手册页(针对版本 17)明确指出:

默认情况下,PostgreSQL 不会执行任何服务器证书的验证。

要强制验证,sslmode必须设置为verify-ca检查证书是否被链信任,或者还要检查verify-full证书中的名称是否与连接字符串中的名称匹配。libpq

如果您使用,它可能看起来像这样:

connect = host=localhost dbname=mails user=admin password=pass sslmode=verify-full

仅提到了 Dovecot;我预计至少还会有一些 MTA,其配置可能也需要进行类似的调整。

您的客户端系统还必须具有~/.postgresql/root.crt包含受信任的根 CA 证书的文件。因此,您必须找到 Dovecot 的用户主目录并将根证书放在那里。或者,您可以将sslrootcert=/path/to/file参数设置为连接字符串以指定包含受信任的根 CA 证书的文件,并提供该文件。

2

  • 1
    我最终还添加sslrootcert了参数,以便所有连接到 psql 实例的用户都可以验证证书。


    – 


  • 好主意,我认为在答案中提到这个参数也会有益,所以我更新了它!


    –