1.搭建CA環(huán)境(使用數(shù)據(jù)庫(kù)OS賬戶vastbase)
1.1.創(chuàng)建認(rèn)證機(jī)制配置目錄
cd ~
mkdir test

image.png
1.2.拷貝openssl文件到上述配置目錄
cd /etc/pki/tls
cp openssl.cnf ~/test

image.png
1.3.開(kāi)始在 test文件夾下 創(chuàng)建CA環(huán)境
cd ~/test
1)創(chuàng)建文件夾demoCA./demoCA/newcerts./demoCA/private 并授權(quán)
mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
chmod 777 ./demoCA/private
2)創(chuàng)建serial文件,寫(xiě)入01
echo '01'>./demoCA/serial
3)創(chuàng)建文件index.txt
touch ./demoCA/index.txt
4)修改openssl.cnf配置文件中配置項(xiàng)[ CA_default ]下的dir參數(shù)
dir = ./demoCA
default_md = sha256
--至此CA環(huán)境搭建完成

image.png
2.生成根私鑰(root用戶下執(zhí)行)
2.1.生成CA私鑰 (openssl是數(shù)據(jù)庫(kù)安裝路徑下的一二進(jìn)制工具)
'[root@tpcc02 /home/vastbase/test]#cd /home/vastbase/test/
[root@tpcc02 /home/vastbase/test]#openssl genrsa -aes256 -out demoCA/private/cakey.pem 2048
-----執(zhí)行以上命令,會(huì)要求輸入兩次密碼 sys_Oracle_1

image.png
3.生成根證書(shū)請(qǐng)求文件server.req
'[root@tpcc02 /home/vastbase/test]# openssl req -config openssl.cnf -new -key demoCA/private/cakey.pem -out demoCA/careq.pem
---依次輸入:
sys_Oracle_1 |CN |ningxia |yinchuan|vastdata |vastbase |mike |可忽略(直接回車) |sys_Oracle_1 |vastdata

image.png
4.生成自簽發(fā)根證書(shū)
4.1.修改openssl.cnf文件中的配置項(xiàng)[usr_cert]下的basicConstraints參數(shù):
'[root@tpcc02 /home/vastbase/test]# vim openssl.cnf
basicConstraints=CA:TRUE
4.2.生成CA自簽發(fā)根證書(shū)
'[root@tpcc02 /home/vastbase/test]# openssl ca -config openssl.cnf -out demoCA/cacert.pem -keyfile demoCA/private/cakey.pem -selfsign -infiles demoCA/careq.pem
----依次輸入密碼sys_Oracle_1, 兩次確認(rèn)輸入 y
--至此CA根證書(shū)自簽發(fā)完成,根證書(shū)demoCA/cacert.pem。

image.png
5.生成服務(wù)端證書(shū)私鑰
5.1.生成服務(wù)器私鑰文件server.key
'[root@tpcc02 /home/vastbase/test]# openssl genrsa -aes256 -out server.key 2048
---連續(xù)輸入兩次密碼 sys_Oracle_1

image.png
6.生成服務(wù)端證書(shū)請(qǐng)求文件
6.1.生成服務(wù)器證書(shū)請(qǐng)求文件server.req
'[root@tpcc02 /home/vastbase/test]# openssl req -config openssl.cnf -new -key server.key -out server.req
---依次輸入:
sys_Oracle_1 |CN |ningxia |yinchuan|vastdata |vastbase |mike |可忽略 |sys_Oracle_1 |vastdata

image.png
7.生成服務(wù)端證書(shū)
7.1.修改openssl.cnf文件中的配置項(xiàng)[usr_cert]下的 basicConstraints 參數(shù):
[usr_cert]
basicConstraints=CA:TRUE 改為 CA:FALSE
7.2.修改 demoCA/index.txt.attr中屬性為no。
'[root@tpcc02 /home/vastbase/test]#vi demoCA/index.txt.attr
unique_subject = yes --改為no
7.3.對(duì)生成的服務(wù)器證書(shū)請(qǐng)求文件進(jìn)行簽發(fā),簽發(fā)后將生成正式的服務(wù)器證書(shū)server.crt
[root@tpcc02 /home/vastbase/test]#openssl ca -config openssl.cnf -in server.req -out server.crt -days 3650 -md sha256
-----依次輸入密碼 sys_Oracle_1, 兩次確認(rèn)輸入 y

image.png
7.4.如果不去掉服務(wù)器私鑰的密碼保護(hù)需要使用vb_guc工具對(duì)存儲(chǔ)密碼進(jìn)行加密保護(hù)(vastbase用戶下執(zhí)行)
[vastbase@tpcc02 ~/test]$vb_guc encrypt -M server -K sys_Oracle_1 -D ./
---vb_guc加密后會(huì)生成server.key.cipher,server.key.rand兩個(gè)私鑰密碼保護(hù)文件。

image.png
8.客戶端證書(shū)、私鑰生成
8.1.生成客戶端私鑰
'[root@tpcc02 /home/vastbase/test]# openssl genrsa -aes256 -out client.key 2048
輸入兩次密碼 sys_Oracle_1

image.png
8.2.生成客戶端證書(shū)請(qǐng)求文件
'[root@tpcc02 /home/vastbase/test]#openssl req -config openssl.cnf -new -key client.key -out client.req
---依次輸入:
sys_Oracle_1 |CN |ningxia |yinchuan|vastdata |vastbase |mike |可忽略 |sys_Oracle_1 |vastdata

image.png
8.3.對(duì)生成的客戶端證書(shū)請(qǐng)求文件進(jìn)行簽發(fā),簽發(fā)后將生成正式的客戶端證書(shū)client.crt
[root@tpcc02 /home/vastbase/test]#openssl ca -config openssl.cnf -in client.req -out client.crt -days 3650 -md sha256
-----依次輸入密碼 sys_Oracle_1, 兩次確認(rèn)輸入 y

image.png
8.4.如果不去掉客戶端私鑰的密碼保護(hù)需要使用vb_guc工具對(duì)存儲(chǔ)密碼進(jìn)行加密保護(hù)
[vastbase@tpcc02 ~/test]$ vb_guc encrypt -M client -K sys_Oracle_1 -D ./
---vb_guc加密后會(huì)生成client.key.cipher,client.key.rand兩個(gè)私鑰密碼保護(hù)文件。

image.png
8.5.將客戶端密鑰轉(zhuǎn)化為DER格式,方法如下:
[root@tpcc02 /home/vastbase/test]#openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
--輸入密碼 sys_Oracle_1

image.png
9.數(shù)據(jù)庫(kù)配置
9.1.拷貝 server.crt、server.key、server.key.cipher、server.key.rand、server.req、cacert.pem拷貝至實(shí)例目錄下,并修改權(quán)限:
'[root@tpcc02 ~]#cd /home/vastbase/test
[root@tpcc02 /home/vastbase/test]# chown vastbase. client.*
[root@tpcc02 /home/vastbase/test]# chown vastbase. server.*
[root@tpcc02 /home/vastbase/test]# cd demoCA/
[root@tpcc02 /home/vastbase/test/demoCA]# chown vastbase. cacert.pem
9.2.在vastbase用戶下拷貝認(rèn)證文件:
[vastbase@tpcc02 ~/test/demoCA]$ cp cacert.pem $PGDATA
[vastbase@tpcc02 ~/test]$ cp server.* $PGDATA

image.png

image.png
9.3.授權(quán)600權(quán)限
[vastbase@tpcc02 ~/data/vastbase]$ chmod 600 server.*
[vastbase@tpcc02 ~/data/vastbase]$ chmod 600 cacert.pem

image.png
9.4.在postgresql.conf文件中添加相關(guān)參數(shù):
ssl = on
require_ssl = on
ssl_cert_file='server.crt'
ssl_key_file='server.key'
ssl_ca_file='cacert.pem'
9.5.在pg_hba.conf中添加hostssl,重啟數(shù)據(jù)庫(kù)restart
hostssl all all 0.0.0.0/0 sha256
[vastbase@tpcc02 ~/data/vastbase]$ vb_ctl restart

image.png
9.6.配置客戶端PGSSLCERT、PGSSLKEY、PGSSLMODE、PGSSLROOTCERT參數(shù):
[vastbase@tpcc02 ~]$vim .Vastbase
export PGSSLCERT="$HOME/test/client.crt"
export PGSSLKEY="$HOME/test/client.key"
export PGSSLMODE="verify-ca"
export PGSSLROOTCERT="$HOME/test/demoCA/cacert.pem"
[vastbase@tpcc02 ~]$ source ~/.Vastbase
9.7.修改客戶端秘鑰的權(quán)限:
[vastbase@tpcc02 ~]$ cd test/
[vastbase@tpcc02 ~/test]$ chmod 600 client.key
[vastbase@tpcc02 ~/test]$ chmod 600 client.key.pk8
[vastbase@tpcc02 ~/test]$ chmod 600 client.crt
[vastbase@tpcc02 ~/test]$ chmod 600 client.key.cipher
[vastbase@tpcc02 ~/test]$ chmod 600 client.key.rand
[vastbase@tpcc02 ~/test]$ chmod 600 demoCA/cacert.pem

image.png

image.png
10.測(cè)試驗(yàn)證
10.1.客戶端vsql連接服務(wù)端:
[vastbase@tpcc02 ~/data/vastbase]$ vsql -r -d testdb -h 10.0.0.152 -Utestuser -WHailiang@123

image.png
10.2.vds開(kāi)發(fā)工具連接數(shù)據(jù)庫(kù)(SSL方式):

image.png
10.3.使用tcpdump工具抓取傳輸數(shù)據(jù)(加密前是明文,加密后是密文)
[root@tpcc02 ~]# tcpdump -i ens33 -s 0 -l -w - dst port 5432 | strings

image.png
10.4.在vds客戶端發(fā)送查詢表的sql

image.png
10.5.tcpdump 已經(jīng)能正常抓取到數(shù)據(jù),為密文

image.png
11.JDBC連接示例:
import java.util.Properties;
String urlWithCe = "jdbc:postgresql://10.0.0.152:5432/testdb" ;
Properties properties = new Properties();
// 配置以ssl訪問(wèn)
properties.setProperty("ssl", "true");
// 配置根證書(shū)地址
properties.setProperty("sslrootcert", "cacert.pem");
// 配置客戶端私鑰地址
properties.setProperty("sslkey", "client.key");
// 配置客戶端證書(shū)地址
properties.setProperty("sslcert", "client.crt");
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(urlWithCe, properties);