无法在 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 进程的任何人都可读。这已经使任何安全利益变得可疑。
我正在按照此 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 进程的任何人都可读。这已经使任何安全利益变得可疑。