16.7. 用 SSL 進行安全的 TCP/IP 連線

PostgreSQL 有一個內建的透過 SSL 進行加密的客戶端/伺服器端的通訊, 這樣可以增加安全性。這個功能要求在客戶端和伺服器端都安裝 OpenSSL 並且在製作PostgreSQL的時候打開(參閱 Chapter 14)。

當編譯了SSL進去以後,可以透過設置 postgresql.conf 裡的參數 sslon 來打開 PostgreSQL 伺服器的SSL支援。 當開始SSL模式後, 伺服器將在資料目錄裡查找 server.key 文件和 server.crt 文件,必須分別包含伺服器私鑰和證書。 在打開SSL的伺服器執行之前必須先正確的設置這些文件。 如果私鑰用一個指令保護,那麼伺服器將提示輸入指令,並且在指令成功檢驗之前不會啟動。

伺服器將在同一個 TCP 連接埠上同時監聽標準的和SSL的連線, 並且將與任何正在連線的客戶端進行協商,協商是否使用SSL。 預設時,這是根據客戶端的選項而定的。 參閱 Section 19.1 獲取如何強制伺服器端只使用SSL進行某些或者全部連線的訊息。

有關建立您的伺服器私鑰和證書的細節訊息,您們可以參考 OpenSSL 的文件。 您可以用一個自認證的證書進行測試, 但是在生產環境中應該使用一個由認證中心(CA) (全球的 CA或者區域的CA都可以)簽發的證書, 這樣客戶端才能夠識別伺服器的身份。 要建立一份自認證的證書,可以使用下面的OpenSSL命令

openssl req -new -text -out server.req

填充那些openssl向您詢問的訊息。 確保把本地主機名當做Common Name輸入。 該程序將生成一把用指令保護的密鑰。小於四字元的指令保護是不被接受的。 要移去密鑰(如果您想自動啟動伺服器就得這樣),執行下面的命令

openssl rsa -in privkey.pem -out server.keyrm privkey.pem

輸入舊指令把現有密鑰解鎖。然後

openssl req -x509 -in server.req -text -key server.key -out server.crtchmod og-rwx server.key

把證書變成自簽名的證書,然後把秘鑰和證書拷貝到伺服器尋找它們的地方。

如果需要驗證客戶端的證書,那麼在資料目錄的 root.crt 裡放置您想檢驗的 CA 的證書。 如果出現這個證書,那麼在 SSL 連接啟動的時候就會要求客戶端提供客戶端的證書, 並且這個證書必須是已經由 root.crt 裡面出現的認證之一簽發的。

如果沒有 root.crt 文件,那麼就不需要檢查客戶端認證。 這個模式下,SSL 提供通訊安全但不保證認證。

文件 server.keyserver.crt,和 root.crt 只是在伺服器啟動的時候檢查;如果您修改了他們,那麼必須重啟伺服器才能生效。