簡體   English   中英

我如何配置 PostgreSQL 的 pg_hba.conf 以允許使用經過驗證的證書進行連接,但如果不這樣做則拒絕它們(包括本地主機)?

[英]How do I configure PostgreSQL's pg_hba.conf to allow connections with a verified certificate but to reject them (incl. localhost) if they don't?

我已經使用 PostgreSQL 二進制文件在我的本地計算機上設置了 PostgreSQL (v.15) 服務器。

我已經使用此鏈接生成了證書。

我已將證書存儲在 c:/certs 中,並將它們復制到本地 PostgreSQL 服務器( postgresql.conf文件所在的同一服務器)的數據文件夾中。 我已經將postgresql.conf配置為使用 SSL 和證書,如此圖所示

當我嘗試使用 psql 連接到 PostgreSQL 服務器時,我希望它僅在提供有效證書時才接受我的連接嘗試,例如以下格式:

psql 'host=localhost port=5432 dbname=local-db user=admin sslmode=verify-full sslcert=c:/certs/cert.pem sslkey=c:/certs/cert-key.pem sslrootcert=c:/certs/ca.pem'

但是我希望它在我不提供證書時拒絕我的連接嘗試,例如以下格式:

psql 'host=localhost port=5432 dbname=local-db user=admin'

我假設我需要以特定方式配置 PostgreSQL 服務器的pg_hba.conf文件(它與證書和postgresql.conf文件位於同一文件夾中),並且我已經嘗試了我可以在 inte.net 上找到的所有建議,但我一直以服務器結束,要么允許上述兩種連接嘗試,要么都不允許,但絕不允許一個而不允許另一個。

我嘗試按如下方式配置pg_hba.conf

hostnossl   all   all   0.0.0.0/0   reject
hostssl     all   all   0.0.0.0/0   cert clientcert=verify-full

但是隨后我收到以下提供證書的連接錯誤:

psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL:  no pg_hba.conf entry for host "::1", user "admin", database "local-db", SSL encryption

對於不提供證書的連接,我收到以下兩個錯誤:

psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL:  no pg_hba.conf entry for host "::1", user "admin", database "local-db", SSL encryption

connection to server at "localhost" (::1), port 5432 failed: FATAL:  no pg_hba.conf entry for host "::1", user "admin", database "local-db", no encryption

我想原因是它試圖通過 IPv6 而不是 Ipv4 進行連接。 當我配置pg_hba.conf如下:

hostnossl   all   all   ::/0   reject
hostssl     all   all   ::/0   cert clientcert=verify-full

然后它似乎阻止了不提供證書的連接(根據需要):

psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL:  connection requires a valid client certificate

connection to server at "localhost" (::1), port 5432 failed: FATAL:  pg_hba.conf rejects connection for host "::1", user "admin", database "local-db", no encryption

但是對於提供證書的連接,我也收到以下錯誤:

psql: error: connection to server at "localhost" (::1), port 5432 failed: FATAL:  certificate authentication failed for user "admin"

當我使用以下 CLI 命令驗證證書時: openssl verify -CAfile ca.pem -verbose cert.pem 然后它告訴我證書是“OK”的,所以我不知道可能出了什么問題,但我認為它與我的pg_hba配置(和/或我的psql連接字符串)有關。

我已經嘗試將clientcert=verify-full更改為clientcert=1 ,因為我已經看到很多人在網上推薦它,但是我的 PostgreSQL 服務器拒絕再次啟動(每當我對其.conf文件進行更改時我都會重新啟動它)並且在其日志文件中注冊以下兩行:

FATAL:  could not load pg_hba.conf
LOG:  database system is shut down

請幫助我了解如何讓 PostgreSQL 服務器僅接受提供證書的連接。

看來我的證書設置不正確。 我使用此鏈接生成新證書(並修改了 CN [Common Name] 值以匹配我的主機名 [localhost] 和用戶名 [admin],如下所示):

openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key -subj "/CN=root-ca"

openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -new -nodes -key server.key -out server.csr -subj "/CN=localhost"
openssl x509 -req -in server.csr -days 365 -CA ca.crt -CAkey ca.key - CAcreateserial -out server.crt

openssl genrsa -des3 -out client.key 2048
openssl rsa -in client.key -out client.key
openssl req -new -nodes -key client.key -out client.csr -subj "/CN=admin"
openssl x509 -req -in client.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

然后我將它們復制到上述數據文件夾並修改postgresql.conf如下:

ssl = on
ssl_ca_file = 'ca.crt'
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'

pg_hba.conf中,我只在底部設置了以下兩行(rest 被注釋掉了):

hostnossl   all   all   0.0.0.0/0   reject
hostnossl   all   all   ::/0        reject
hostssl     all   all   0.0.0.0/0   cert clientcert=verify-full
hostssl     all   all   ::/0        cert clientcert=verify-full

有了這個,它做了我想要的,它阻止了沒有提供證書的連接,同時允許提供證書的連接(如下所示):

psql 'host=localhost port=5432 dbname=local-db user=admin sslmode=verify-full sslcert=c:/certs/client.crt sslkey=c:/certs/client.key sslrootcert=c:/certs/ca.crt'

正確設置公用名是連接嘗試被接受還是被拒絕的(最)決定性因素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM