无法在 Postgres 14 逻辑复制上启动 GSSAPI 安全上下文

could not initiate GSSAPI security context on Postgres 14 logical replication

我正在按照此 post 在 Postgres 14 上启用 ssl 以进行逻辑复制。然后尝试在客户端建立连接:

CREATE SUBSCRIPTION my-sub
CONNECTION 'host=my-domain.com dbname=my-db user=my-username password=xxxxxx'
PUBLICATION my-pub;

它抛出错误:

2022-05-12 13:51:36.047 PDT [37340] ERROR:  could not connect to the publisher: connection to server at "my_domain.com" (xxx.xxx.xxx.141), port 5432 failed: could not initiate GSSAPI security context:  The operation or option is not available: Credential for asked mech-type mech not found in the credential handle
    connection to server at "my_domain.com" (xxx.xxx.xxx.141), port 5432 failed: FATAL:  connection requires a valid client certificate
    connection to server at "my-domain.com" (xxx.xxx.xxx.141), port 5432 failed: FATAL:  no pg_hba.conf entry for host "xxx.xxx.xxx.199", user "my-username", database "my-db", no encryption

在 my-pub 服务器上,添加了一行 pg_hba.conf:

hostssl all             all             0.0.0.0/0               scram-sha-256 clientcert=verify-full
 

在子客户端上,ca文件设置如下:

ssl_ca_file = '/usr/local/var/postgres/root.crt'. //<<==client cert copied from pub server. 

大多数人只使用服务证书。使用客户端证书是不寻常的,尤其是在逻辑复制订阅者的情况下。但是,如果您确实希望发布者要求提供客户端证书,那么它没有针对该目的进行错误配置(或者至少,我们无法从当前数据中看出这一点)。发布者要求客户证书,但订阅者不提供。配置问题在订阅者上。

请注意,在这种情况下,订阅者将充当连接到发布者的客户端,而不是充当服务器的角色。它使用 libpq 客户端库来执行此操作,因此它的配置不基于 postgresql.conf 的内容。特别是,ssl_ca_file 是服务器配置选项,而不是客户端配置。

因此,实现此目的的方法是使 CONNECTION 看起来像

'host=my-domain.com dbname=my-db user=my-username password=xxxxxx sslcert=/foobar/my-username.crt sslkey=/foobar/my-username.key'

但要使其正常工作,证书和密钥需要位于订户计算机上,对于拥有 postgres 进程的任何人都可读。这已经使任何安全利益变得可疑。