啟用 PostgreSQL SSL 加密傳輸,保護資料在網路傳輸中機密性與完整性。本文提供從 OpenSSL 自簽憑證產生、伺服器 `postgresql.conf` 配置、客戶端 (ODBC/psql) 設定的完整步驟,適用開發/測試環境;生產環境建議申請 CA 簽署憑證。
# 1. 產生私鑰 (移除密碼短語,避免啟動需手動輸入)
openssl genrsa -out server.key 2048
# 2. 產生憑證簽署請求 (CSR) - Common Name 填寫伺服器 FQDN 或 IP
openssl req -new -key server.key -out server.csr -config openssl.cnf
# 互動式輸入: CN = pg-server.example.com (或 192.168.1.100)
# 3. 自簽憑證 (有效期 365 天)
openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 365
# 4. (可選) 轉 DER 格式供特定客戶端使用
openssl x509 -in server.crt -out server.der.crt -outform DER
server.crt、server.key 複製至 PostgreSQL **資料目錄** (通常 `chmod 600 server.key
chmod 644 server.crt
chown postgres:postgres server.key server.crt
# 啟用 SSL
ssl = on
# 憑證檔案路徑 (相對於資料目錄)
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# (可選) CA 憑證驗證客戶端憑證
# ssl_ca_file = 'root.crt'
# (可選) 僅允許加密連線 (拒絕平文)
# ssl_min_protocol_version = 'TLSv1.2'
# ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'
# 系統服務
systemctl reload postgresql-14
# 或
pg_ctl reload -D /var/lib/pgsql/data
# 強制 SSL 模式連線
psql "host=pg-server.example.com port=5432 dbname=mydb user=myuser sslmode=require"
# 連線成功後查詢 SSL 狀態
\conninfo
# 輸出應包含: SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256)
require (驗證憑證) 或 verify-ca/verify-full (需 CA)server.crt 至「受信任的根憑證授權機構」| 模式 | 行為 | 適用場景 |
|---|---|---|
disable | 不加密 | 僅測試/內網受信環境 |
allow | 嘗試 SSL,失敗回退平文 | 不推薦 |
prefer | 優先 SSL,失敗回退 | 相容舊客戶端 |
require | **強制 SSL,不驗證 CA** | 自簽憑證、內網生產 |
verify-ca | 強制 SSL + 驗證 CA | 企業 CA 環境 |
verify-full | 強制 SSL + 驗證 CA + 驗證 CN/主體替代名 | 最高安全、生產標準 |
完成配置後,所有經網路傳輸的查詢、結果、認證資訊皆受 TLS 加密保護,告別明文傳輸風險。