1.搭建CA环境(使用数据库OS账户vastbase)
1.1.创建认证机制配置目录
cd ~
mkdir test
1.2.拷贝openssl文件到上述配置目录
cd /etc/pki/tls
cp openssl.cnf ~/test
1.3.开始在 test文件夹下 创建CA环境
cd ~/test
1)创建文件夹demoCA./demoCA/newcerts./demoCA/private 并授权
mkdir ./demoCA ./demoCA/newcerts ./demoCA/private
chmod 777 ./demoCA/private
2)创建serial文件,写入01
echo '01'>./demoCA/serial
3)创建文件index.txt
touch ./demoCA/index.txt
4)修改openssl.cnf配置文件中配置项[ CA_default ]下的dir参数
dir = ./demoCA
default_md = sha256
--至此CA环境搭建完成
2.生成根私钥(root用户下执行)
2.1.生成CA私钥 (openssl是数据库安装路径下的一二进制工具)
'[root@tpcc02 /home/vastbase/test]#cd /home/vastbase/test/
[root@tpcc02 /home/vastbase/test]#openssl genrsa -aes256 -out demoCA/private/cakey.pem 2048
-----执行以上命令,会要求输入两次密码 sys_Oracle_1
3.生成根证书请求文件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
4.生成自签发根证书
4.1.修改openssl.cnf文件中的配置项[usr_cert]下的basicConstraints参数:
'[root@tpcc02 /home/vastbase/test]# vim openssl.cnf
basicConstraints=CA:TRUE
4.2.生成CA自签发根证书
'[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, 两次确认输入 y
--至此CA根证书自签发完成,根证书demoCA/cacert.pem。
5.生成服务端证书私钥
5.1.生成服务器私钥文件server.key
'[root@tpcc02 /home/vastbase/test]# openssl genrsa -aes256 -out server.key 2048
---连续输入两次密码 sys_Oracle_1
6.生成服务端证书请求文件
6.1.生成服务器证书请求文件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
7.生成服务端证书
7.1.修改openssl.cnf文件中的配置项[usr_cert]下的 basicConstraints 参数:
[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.对生成的服务器证书请求文件进行签发,签发后将生成正式的服务器证书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, 两次确认输入 y
7.4.如果不去掉服务器私钥的密码保护需要使用vb_guc工具对存储密码进行加密保护(vastbase用户下执行)
[vastbase@tpcc02 ~/test]$vb_guc encrypt -M server -K sys_Oracle_1 -D ./
---vb_guc加密后会生成server.key.cipher,server.key.rand两个私钥密码保护文件。
8.客户端证书、私钥生成
8.1.生成客户端私钥
'[root@tpcc02 /home/vastbase/test]# openssl genrsa -aes256 -out client.key 2048
输入两次密码 sys_Oracle_1
8.2.生成客户端证书请求文件
'[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
8.3.对生成的客户端证书请求文件进行签发,签发后将生成正式的客户端证书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, 两次确认输入 y
8.4.如果不去掉客户端私钥的密码保护需要使用vb_guc工具对存储密码进行加密保护
[vastbase@tpcc02 ~/test]$ vb_guc encrypt -M client -K sys_Oracle_1 -D ./
---vb_guc加密后会生成client.key.cipher,client.key.rand两个私钥密码保护文件。
8.5.将客户端密钥转化为DER格式,方法如下:
[root@tpcc02 /home/vastbase/test]#openssl pkcs8 -topk8 -outform DER -in client.key -out client.key.pk8 -nocrypt
--输入密码 sys_Oracle_1
9.数据库配置
9.1.拷贝 server.crt、server.key、server.key.cipher、server.key.rand、server.req、cacert.pem拷贝至实例目录下,并修改权限:
'[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用户下拷贝认证文件:
[vastbase@tpcc02 ~/test/demoCA]$ cp cacert.pem $PGDATA
[vastbase@tpcc02 ~/test]$ cp server.* $PGDATA
9.3.授权600权限
[vastbase@tpcc02 ~/data/vastbase]$ chmod 600 server.*
[vastbase@tpcc02 ~/data/vastbase]$ chmod 600 cacert.pem
9.4.在postgresql.conf文件中添加相关参数:
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,重启数据库restart
hostssl all all 0.0.0.0/0 sha256
[vastbase@tpcc02 ~/data/vastbase]$ vb_ctl restart
9.6.配置客户端PGSSLCERT、PGSSLKEY、PGSSLMODE、PGSSLROOTCERT参数:
[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.修改客户端秘钥的权限:
[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
10.测试验证
10.1.客户端vsql连接服务端:
[vastbase@tpcc02 ~/data/vastbase]$ vsql -r -d testdb -h 10.0.0.152 -Utestuser -WHailiang@123
10.2.vds开发工具连接数据库(SSL方式):
10.3.使用tcpdump工具抓取传输数据(加密前是明文,加密后是密文)
[root@tpcc02 ~]# tcpdump -i ens33 -s 0 -l -w - dst port 5432 | strings
10.4.在vds客户端发送查询表的sql
10.5.tcpdump 已经能正常抓取到数据,为密文
11.JDBC连接示例:
import java.util.Properties;
String urlWithCe = "jdbc:postgresql://10.0.0.152:5432/testdb" ;
Properties properties = new Properties();
// 配置以ssl访问
properties.setProperty("ssl", "true");
// 配置根证书地址
properties.setProperty("sslrootcert", "cacert.pem");
// 配置客户端私钥地址
properties.setProperty("sslkey", "client.key");
// 配置客户端证书地址
properties.setProperty("sslcert", "client.crt");
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection(urlWithCe, properties);