Contents

PostgresSQL 不支援10 驗證類型。請核對您已經組態pg_hba.conf 文件包含客戶端的IP位址或網路區段,以及驅動程序所支援的驗證架構模式已被支援。

這個錯誤第一次看到真的很容易愣住,因為訊息很長,看起來像 IP 沒開、帳號密碼錯、驅動不支援全部混在一起。實際上這類問題大多是在說「資料庫目前要求的驗證方式,和你手上的 client 或 driver 對不起來」。

https://i.imgur.com/PECrHRl.png

https://i.imgur.com/qy5qLd1.png

這個錯誤在講什麼

PostgreSQL 連線時,不是只檢查帳號密碼而已,還會依照 pg_hba.conf 決定:

  1. 哪個來源 IP 可以連。
  2. 要求哪種驗證方式。
  3. 這個資料庫、這個使用者是否套用這條規則。

如果 server 端要求的是某種驗證模式,例如 scram-sha-256,但你的 JDBC driver、ODBC driver 或 GUI 工具太舊,就可能出現「不支援某驗證類型」這種訊息。

常見成因

我後來整理,最常見其實是下面幾種:

  1. PostgreSQL 版本升上去後,預設密碼加密方式改成較新的模式。
  2. pg_hba.conf 寫成 scram-sha-256,但應用程式 driver 太舊。
  3. 連線來源 IP 不在允許清單內,結果被導到另一條不預期的驗證規則。
  4. DBA 重設密碼後,密碼是用新格式儲存,但舊程式還在用老驅動。

先檢查哪幾件事

建議先不要急著改資料庫,先把資訊核對清楚:

1. 確認 PostgreSQL 版本

如果是 PostgreSQL 10 之後,很多環境開始逐步改用較新的驗證模式,舊驅動踩雷機率會高很多。

2. 看 pg_hba.conf 目前規則

通常會看到像這種設定:

1
2
host    all             all             0.0.0.0/0               md5
host    all             all             192.168.1.0/24          scram-sha-256

最後那個欄位就是驗證方式。若程式連進來命中的是 scram-sha-256,但 client 只支援舊模式,就會報錯。

3. 檢查 driver 版本

如果你是 Java 專案,先看 PostgreSQL JDBC driver 版本;如果是 DBeaver、Navicat、資料交換工具,也要確認內建 driver 是不是太舊。

很多時候不是 PostgreSQL 壞掉,是連線端太老。

我會怎麼排查

實務上我會照這個順序查:

  1. 確認連線字串是否真的連到預期那台資料庫。
  2. 請 DBA 或自己查看 pg_hba.conf 哪條規則命中。
  3. 確認目前帳號密碼是否近期有重設。
  4. 檢查應用程式 driver 版本是否支援目前驗證方式。
  5. 最後才決定要升 driver 還是暫時調整驗證方式。

可行解法

解法 1:升級 driver

這通常是我最優先建議的方法,因為比較不會把整個安全設定往下拉。尤其正式環境若已經走 scram-sha-256,不太建議只是為了遷就舊工具就改回更舊的方式。

解法 2:調整 pg_hba.conf 驗證方式

如果是過渡期環境,且你明確知道風險,可以暫時把該來源網段改成舊的驗證模式,例如 md5。但這類調整最好只針對特定網段或特定帳號,不要整份設定全改鬆。

解法 3:重設帳號密碼並重新套用相容策略

某些情況是帳號密碼儲存格式已經換掉,這時就算 pg_hba.conf 改了也不一定完全對。若環境允許,可以請 DBA 依新策略重設密碼,再重新測一次。

小提醒

  1. 不要只看錯誤訊息中的「帳號密碼」,很多時候核心是驗證模式相容性。
  2. 不要直接把所有 host 規則改成最寬鬆,這很容易把其他系統一起影響到。
  3. 測試環境修好後,記得把 driver 版本記下來,不然下一台工具又會踩一次同樣問題。

參考資料

不支援 10 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网路区段,以及驱动程序所支援的验证架构模式已被支援。_楊伟光的博客-CSDN博客

从pg_hba.conf文件谈谈postgresql的连接认证 - 非我在 - 博客园