如何用OpenSSH生成證書SSL

| SQL | 3 Reads

要在 PostgreSQL 中使用 SSL/TLS,你需要產生伺服器憑證(server certificate)與可選的客戶端憑證(client certificate)。以下是使用 OpenSSL 自行簽署憑證的完整流程(適用於測試或內部部署環境):


一步步產生 PostgreSQL 用的 SSL 憑證

本示範以 Linux/macOS 為例,在 Windows 可用 Git Bash 或安裝 OpenSSL 工具。

建立一個工作資料夾

mkdir pgssl && cd pgssl

步驟一:建立自簽 CA(可重用)

openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=MyTestCA"

這會產生:

  • ca.key:CA 的私鑰

  • ca.crt:CA 的公鑰(可簽署其他憑證)


步驟二:產生伺服器憑證

2-1. 建立私鑰與簽署請求(CSR)

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/CN=your.server.hostname"

CN 要與實際連接用的 FQDN(主機名)一致,例如:/CN=db.example.com
使用 IP 地址的話要加入 Subject Alternative Name(略複雜,後述補充)。

2-2. 使用 CA 簽署伺服器憑證

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365

步驟三(可選):產生客戶端憑證

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

設定檔案權限(非常重要)

chmod 600 server.key
chmod 600 client.key

最終檔案列表

檔案 用途 放置位置
server.key 伺服器私鑰 PostgreSQL 伺服器(data 目錄)
server.crt 伺服器憑證 同上
ca.crt CA 根憑證 放在 client 和 server 都需要的地方
client.key 客戶端私鑰(若用雙向驗證) 用戶端
client.crt 客戶端憑證(若用雙向驗證) 用戶端

PostgreSQL 中設定方式(伺服器端)

postgresql.conf 中加入:

ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'ca.crt' # 如果要驗證客戶端(雙向驗證)

pg_hba.conf 中加入:

hostssl all all 0.0.0.0/0 cert

啟動 PostgreSQL 後測試

psql "host=your.server.hostname dbname=mydb user=myuser sslmode=verify-full sslrootcert=ca.crt sslcert=client.crt sslkey=client.key"

This article was last edited at