SSL傳輸加密簡介
SSL認證通過使用SSL證書確保客戶端檢查服務端證書或者服務器檢查客戶端證書,SSL認證除了加密數據,也可以識別目標端的真偽,防止網絡中間人的偽裝攻擊。
單向認證與雙向認證
單向認證
單向認證一般是指客戶端只驗證服務器證書的有效性,而服務端不驗證客戶端證書的有效性。服務器加載服務端證書信息并發送給客戶端,客戶端使用根證書來驗證服務器端證書的有效性。
雙向認證
雙向認證是指客戶端驗證服務器證書的有效性,同時服務器端也要驗證客戶端證書的有效性,只有兩端都認證成功,連接才能建立。
客戶端驗證服務器證書有如下兩種模式:
- 客戶端連接參數SSLMODE設置為verify-ca僅校驗數據庫證書真偽
- 客戶端連接參數SSLMODE設置為verify-full校驗數據庫證書真偽及
通用名CN匹配數據庫連接的hostname
服務端驗證客戶端證書有如下三種模式:
- 數據庫認證文件pg_hba.conf配置認證選項clientcert=verify-ca僅驗證客戶端證書真偽,認證方法可選。
- 數據庫認證文件pg_hba.conf配置認證選項clientcert=verify-full驗證客戶端證書真偽及CN匹配數據庫連接用戶名或映射匹配,認證方法可選。
- 數據庫認證文件pg_hba.conf配置認證方法cert,免密驗證客戶端證書真偽及CN匹配數據庫連接用戶名或映射匹配。
cert認證實際是基于clientcert=verify-full認證選項的trust方法認證。
SSL編譯支持
PostgreSQL編譯需打開如下選項,同時需要安裝openssl
--with-openssl
--with-includes=/usr/include/openssl
openGauss源碼編譯時不需要打開上面兩個選項,否則編譯會報錯。
客戶端psql或者gsql需要檢查libpq是否有ssl動態庫的調用
$ ldd /opt/pgsql/lib/libpq.so |grep libssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f7f29cc4000)
$ ldd /opt/og/lib/libpq.so |grep libssl
libssl.so.1.1 => /opt/og/lib/libssl.so.1.1 (0x00007f9d39dd2000)
自簽名私有證書測試
測試環境下可以使用自簽名私有證書,只用于測試傳輸加密,不驗證身份,也可使用自簽名CA證書來進行加密及身份驗證。實際生產環境需要使用權威的CA認證中心簽發的數字證書。
本文先測試最簡單的自簽名私有證書。
生成私鑰
$ openssl genrsa -out server.key 2048
生成證書請求文件
$ openssl req -new \
-config openssl.cnf \
-key server.key \
-subj "/CN=foo" \
-out server.csr
注意openGauss需要使用-config指定openssl.cnf文件,centos7下默認路徑為/etc/pki/tls/openssl.cnf,PostgreSQL不需要使用-config選項。
證書自簽名
$ openssl x509 -req -in server.csr -days 365 \
-extfile openssl.cnf \
-extensions v3_ca \
-signkey server.key \
-out server.crt
PostgreSQL不需要使用-config選項。
傳輸證書及密鑰文件至服務器名
$ chmod 0600 server.crt server.key
$ cp server.crt server.key $PGDATA
PGDATA為實際openGauss或PostgreSQL數據目錄。
數據庫配置
pg_hba.conf文件配置hostssl條目,認證方法可選。
hostssl all all 0.0.0.0/0 md5
postgreql.conf文件配置如下參數
ssl=on
ssl_cert_file= 'server.crt'
ssl_key_file= 'server.key'
重啟數據庫服務,然后進行測試。
先測試openGauss,可以看到建立了SSL連接
$ gsql -h 192.168.137.5 -p6432 -Upostgres postgres
Password for user postgres:
gsql ((GaussDB Kernel V500R001C20 build ) compiled at 2021-03-09 18:30:51 commit 0 last mr )
SSL connection (cipher: DHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.
postgres=>
再測試PostgreSQL
$ psql -h192.168.137.11
Password for user postgres:
psql (12.6)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#
總結
1.PostgreSQL需要編譯支持openssl而openGauss已經內置支持。
2.openGauss不會識別操作系統層的openssl默認配置文件,需要拷貝指定參數,否則會報錯找不到配置文件。




