Postgresql

需要幫助理解錯誤消息:錯誤連接到數據庫致命:沒有 pg_hba.conf 條目

  • April 8, 2020

我們正在嘗試使用 QGIS-Application 連接到遠端伺服器上的 postgres/postgis 安裝。當從另一台電腦或同一台電腦通過 pgadmin4v4 使用相同的憑據/身份驗證設置進行訪問時,它工作得很好。因此我得出結論 pg_hba.conf 沒問題,實際上是 QGIS 的問題。

為了更好地理解問題並可能為 QGIS 送出錯誤,我需要幫助分析錯誤消息。它說:

Area: dbname = <databasename>, host <server-ip>, port 5432, user <username>, password <password>, authcfg = <id_of_auth_record>

SSL error: certificate verify failed
FATAL: no pg_hba.conf entry for host <some_other-ip>, user <username>, database <databasename>, SSL off

我的主要問題:

  1. 主機IP地址不應該相同嗎?可能是問題的一部分,提到的第二個 IP 不是正確的伺服器 IP?據我所見,應該只有一台主機(遠端伺服器)和一台客戶端(試圖訪問的電腦)。
  2. 為什麼不說“客戶端沒有 pg_hba.conf 條目……”
  3. QGIS 認為這是證書問題,還是 pg_hba.conf 問題,還是兩者相同

更新:有關安裝的更多詳細資訊

  • 客戶端-PC1:Win10、QGIS 3.4$$ error $$pgAdmin 4v4$$ access ok $$
  • 客戶端-PC2:Win10、QGIS 3.10$$ access ok $$pgAdmin 4v4$$ access ok $$
  • 伺服器:postgres 12
  • pg_hba.conf:
# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             0.0.0.0/0               scram-sha-256
# IPv6 local connections:
hostssl all             all             ::0/0                   scram-sha-256

主機IP地址不應該相同嗎?可能是問題的一部分,提到的第二個 IP 不是正確的伺服器 IP?據我所見,應該只有一台主機(遠端伺服器)和一台客戶端(試圖訪問的電腦)。

如果它們之間有某種防火牆或 NAT,它們通常不會完全相同。但這不應導致驗證失敗,除非您使用客戶端證書和伺服器證書(您似乎沒有使用)。客戶端會將證書中的主機名/IP 地址與其要求的主機名/IP 進行比較,並查看它們是否匹配。

我意識到你可能在問一個不同的問題。“客戶端”和“伺服器”互為補充。“客戶”和“主機”不是互補詞。伺服器和客戶端都有主機名和主機 IP 地址。它們通常不會彼此相同。

為什麼不說“客戶端沒有 pg_hba.conf 條目……”

它正在報告(它認為)客戶端連接的*主機。*如果它只是說“客戶”,那是什麼意思?這可能意味著它不喜歡客戶端是 python 而不是 psql。客戶端主機的問題,而不是客戶端的其他方面。

QGIS 認為這是證書問題,還是 pg_hba.conf 問題,還是兩者相同

兩者,但分開。它首先嘗試使用 SSL,並認為存在證書問題。然後它不嘗試 SSL 並發現 pg_hba 不會讓它這樣做。如果您將客戶端配置為“要求”或更高(而不是“首選”)sslmode,則客戶端將停止進行第二次嘗試。

似乎您的客戶端正在查找一個.postgresql/root.crt或等效文件,但無法使用該文件來驗證伺服器。您可以從您的客戶端隱藏此文件,然後它將停止嘗試驗證伺服器。然後它將僅使用 ssl 進行加密,而不用於驗證。

引用自:https://dba.stackexchange.com/questions/264560