?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
PostgreSQL有一個(gè)內(nèi)建的通過(guò)SSL進(jìn)行加密的客戶端/服務(wù)器端的通訊, 這樣可以增加安全性。這個(gè)特性要求在客戶端和服務(wù)器端都安裝OpenSSL 并且在編譯PostgreSQL的時(shí)候打開(kāi)(參閱Chapter 15)。
當(dāng)編譯了SSL進(jìn)去以后,可以通過(guò)將postgresql.conf中的 ssl設(shè)置為on打開(kāi)PostgreSQL服務(wù)器的SSL支持。 服務(wù)器在同一個(gè)TCP端口監(jiān)聽(tīng)通常和SSL的連接,將判斷客戶端連接是否使用SSL。 缺省,這是在客戶端的選項(xiàng);參閱Section 19.1關(guān)于如何設(shè)置服務(wù)器要求部分或全部連接使用SSL。
PostgreSQL讀取系統(tǒng)范圍的OpenSSL配置文件。缺省,這文件名為openssl.cnf opensslversion-d報(bào)告所在的目錄。通過(guò)設(shè)置環(huán)境變量OPENSSL_CONF指定你想要的配置文件名可以覆蓋此缺省配置。
OpenSSL支持多種不同強(qiáng)度的加密和認(rèn)證算法。 而在OpenSSL配置文件可以指定一個(gè)密碼列表, 你可以通過(guò)在postgresql.conf中修改ssl_ciphers, 指定數(shù)據(jù)庫(kù)服務(wù)器使用的專用密碼。
Note: 使用NULL-SHA或NULL-MD5可能有身份驗(yàn)證開(kāi)銷(xiāo)而沒(méi)有加密開(kāi)銷(xiāo)。 不過(guò),中間人能夠讀取和通過(guò)客戶端和服務(wù)器的通信。此外,加密開(kāi)銷(xiāo)相比身份認(rèn)證的開(kāi)銷(xiāo)是最小的。 有這些原因建議不使用NULL加密。
要SSL模式中啟動(dòng)服務(wù)器,server.crt和server.key必須存在服務(wù)器的數(shù)據(jù)目錄里. 這些文件應(yīng)分別包含服務(wù)器證書(shū)和私鑰。在Unix系統(tǒng),server.key的權(quán)限禁止任何world或group訪問(wèn); 通過(guò)命令chmod0600server.key來(lái)做。如果私鑰受密碼保護(hù),服務(wù)器將會(huì)提示輸入密碼,將會(huì)等到輸入后啟動(dòng)。
在有些情況下,服務(wù)器證書(shū)可能由一個(gè)"中間"認(rèn)證授權(quán)簽名,而不是直接由受信任的客戶端。 若要使用這樣的證書(shū),請(qǐng)追加授權(quán)簽名證書(shū)到theserver.crt文件,然后其父頒發(fā)機(jī)構(gòu)的證書(shū), 等到一個(gè)可信任的客戶端的"根"授權(quán)。server.crt包含多個(gè)證書(shū),在任何情況下應(yīng)包括根證書(shū)。
需要客戶端提供受信任的證書(shū),證書(shū)頒發(fā)機(jī)構(gòu)的地方證書(shū)(CAs) 你信任的在數(shù)據(jù)目錄下的root.crt文件,并且在pg_hba.conf相應(yīng)hostssl行, 設(shè)置參數(shù)clientcert為1。 然后將在SSL連接啟動(dòng)時(shí)從客戶端請(qǐng)求該證書(shū)。(見(jiàn)Section 31.17描述了如何設(shè)置客戶端證書(shū)。) 服務(wù)器將驗(yàn)證客戶端的證書(shū)是由受信任的證書(shū)頒發(fā)機(jī)構(gòu)之一簽名。證書(shū)撤銷(xiāo)清單(CRL)如果存在root.crl 文件,也要檢查。 (見(jiàn)http://h71000.www7.hp.com/DOC/83final/BA554_90007/ch04s02.html圖表顯示SSL證書(shū)的使用。)
在pg_hba.conf文件中clientcert選項(xiàng)對(duì)于所有的認(rèn)證方法都可用,但僅適用hostssl指定的行。 當(dāng)clientcert沒(méi)有指定或設(shè)置為0,如果存在root.crt仍然阻止客戶端證書(shū), 但它不會(huì)堅(jiān)持提交客戶端證書(shū)。
請(qǐng)注意root.crt列出頂級(jí)的客戶端證書(shū),認(rèn)為是受信任的客戶端證書(shū)簽名。 原則上不需要列出服務(wù)器簽名的客戶端證書(shū),然而在大多數(shù)情況下,這些證書(shū)也是受信任的客戶端證書(shū)。
如果你設(shè)置客戶端證書(shū),你可能希望用cert認(rèn)證方法,因此使證書(shū)控制用戶身份驗(yàn)證,以及提供連接安全。參閱Section 19.3.9獲取詳細(xì)信息。
server.key,server.crt, root.crt,和root.crl這些文件僅在服務(wù)器啟動(dòng)時(shí)檢查; 所以你改變它們必須重啟服務(wù)器生效。
Table 17-3. 使用SSL服務(wù)器文件
File | Contents | Effect |
---|---|---|
server.crt | 服務(wù)器證書(shū) | 發(fā)送到客戶端標(biāo)識(shí)服務(wù)器的身份 |
server.key | 服務(wù)器私鑰 | 證明是發(fā)送服務(wù)器證書(shū)的所有者,并不表示證書(shū)所有者是可信的 |
root.crt | 受信任的頒發(fā)機(jī)構(gòu)證書(shū) | 檢查該客戶端證書(shū)由受信任的證書(shū)頒發(fā)機(jī)構(gòu)簽署 |
root.crl | 由證書(shū)頒發(fā)機(jī)構(gòu)吊銷(xiāo)的證書(shū) | 客戶端證書(shū)不能在此列表中 |
創(chuàng)建自簽名的證書(shū),可以使用下面的OpenSSL命令:
opensslreq-new-text-outserver.req
填充那些openssl向你詢問(wèn)的信息。 確保把本地主機(jī)名當(dāng)做"CommonName"輸入;挑戰(zhàn)密碼可以留空。 該程序?qū)⑸梢话延每诹畋Wo(hù)的密鑰。小于四字符的 口令保護(hù)是不被接受的。要移去密鑰(如果你想自動(dòng)啟動(dòng)服務(wù) 器就得這樣),運(yùn)行下面的命令:
opensslrsa-inprivkey.pem-outserver.key rmprivkey.pem
輸入舊口令把現(xiàn)有密鑰解鎖。然后:
opensslreq-x509-inserver.req-text-keyserver.key-outserver.crt
要將一個(gè)證書(shū)變成自簽名證書(shū)的,并將復(fù)制它們的密鑰和證書(shū)到服務(wù)器能找到的地方。最后執(zhí)行操作:
chmodog-rwxserver.key
因?yàn)?,服?wù)器將拒絕該文件,如果其權(quán)限是比這更多自由。更多關(guān)于怎樣創(chuàng)建你的服務(wù)器私鑰和證書(shū), 請(qǐng)參考OpenSSL文檔。
自簽名的證書(shū)可以用于測(cè)試,但證書(shū)是應(yīng)使用由證書(shū)頒發(fā)機(jī)構(gòu)簽署(CA)(要么是全局CAs中的一個(gè)或者一個(gè)本地的) 產(chǎn)生的,因此客戶端可以驗(yàn)證服務(wù)器的身份。如果如果所有客戶都是本地組織的,建議使用本地CA。