续接下面两篇文章:
《opengauss与postgresql对比测试ssl之自签名私有证书测试》自签名私有证书测试
《opengauss与postgresql对比测试ssl之自签名ca证书单向认证测试》自签名ca证书单向认证测试。
本文测试自签名ca证书的双向认证: 客户端验证服务器证书的有效性,同时服务器端也要验证客户端证书的有效性,只有认证成功,连接才能建立。
服务端证书的客户端认证模式
1.客户端sslmode设置为verify-ca仅校验数据库证书真伪。
2.客户端sslmode设置为verify-full校验数据库证书真伪及通用名cn匹配数据库连接的hostname。
客户端证书的服务器认证模式
1.数据库认证文件pg_hba.conf配置认证选项clientcert=verify-ca仅验证客户端证书真伪,认证方法可选。
2.数据库认证文件pg_hba.conf配置认证选项clientcert=verify-full验证客户端证书真伪及cn匹配数据库连接用户名或映射匹配,认证方法可选。
3.数据库认证文件pg_hba.conf配置认证方法cert,免密验证客户端证书真伪及cn匹配数据库连接用户名或映射匹配
自签名ca证书双向认证测试
1.创建ca证书
用于给数据库服务器证书签名的ca证书:ca_server.crt
$ openssl req -new -x509 -days 365 -nodes \
-config openssl.cnf \
-out ca_server.crt -keyout ca_server.key -subj "/cn=fooserverca"
用于给客户端证书签名的ca证书:ca_client.crt
$ openssl req -new -x509 -days 365 -nodes \
-config openssl.cnf \
-out ca_client.crt -keyout ca_client.key -subj "/cn=fooclientca"
2.生成数据库服务器证书请求文件并签名
$ openssl req -new -nodes -text \
-config openssl.cnf \
-out server.csr \
-keyout server.key \
-subj "/cn=192.168.137.5"
将证书请求文件(包含用户信息)和证书签名分开操作,证书请求文件可重用,因为后面可能需要重新生成证书。
使用ca_server.crt对证书请求文件签名
$ openssl x509 -req -in server.csr -text -days 5 \
-ca ca_server.crt \
-cakey ca_server.key \
-cacreateserial \
-out server.crt
这里设置有效期为5天,可以观察在服务器证书有效期小于7天的时候,连接登录后会在日志中产生告警提醒。
3.生成客户端证书请求文件并签名
$ openssl req -new -nodes -text \
-config openssl.cnf \
-out client.csr \
-keyout client.key \
-subj "/cn=dbuser1"
将证书请求文件(包含用户信息)和证书签名分开操作,证书请求文件可重用,因为后面可能需要重新生成证书。
使用ca_client.crt对证书请求文件签名
$ openssl x509 -req -in client.csr -text -days 30 \
-ca ca_client.crt \
-cakey ca_client.key \
-cacreateserial \
-out client.crt
4.传输数据库服务器证书及未加密的私钥文件至数据库服务器
修改文件权限以符合安全设置
$ chmod 0600 ca_client.crt server.crt server.key
传输文件到数据库服务器pgdata目录
$ cp ca_client.crt server.crt server.key $pgdata
注意:如果postgresql使用-g, --allow-group-access
开启了组访问权限,则需要拷贝文件到pgdata目录之外以符合安全设置。
5.数据库ssl参数配置
postgreql.conf文件配置参数
ssl=on
ssl_cert_file= 'server.crt'
ssl_key_file= 'server.key'
ssl_ca_file='ca_client.crt'
然后重启数据库服务。
6.配置数据库客户端
客户端使用linux下psql,证书文件的默认路径为$home/.postgresql/
chmod 0600 client.key client.crt
cp client.crt client.key ~/.postgresql/
cat ca_server.crt > ~/.postgresql/root.crt
chmod 0600 ~/.postgresql/root.crt
测试一
pg_hba.conf文件配置hostssl条目。
hostssl all all 0.0.0.0/0 md5
测试验证数据库服务器证书
opengauss数据库
gsql "sslmode=verify-ca" -p6432 -h 192.168.137.5 -upostgres
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 "sslmode=verify-ca" -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=# \q
使用sslmode=verify-ca仅验证服务器证书真伪,符合预期。
测试二
测试数据库服务器证书设置的通用名cn是否匹配客户端连接的hostname
opengauss数据库
gsql "sslmode=verify-full" -p6432 -h nodex -upostgres
gsql: server common name "192.168.137.5" does not match host name "nodex"
postgresql数据库
psql "sslmode=verify-full" -hnode11
psql: error: server certificate for "192.168.137.11" does not match host name "node11"
分别使用ip地址及主机名测试,与通用名cn匹配的ip地址可成功登录,使用主机名连接报错,报错提示如上,符合预期。
测试三
测试验证客户端证书
pg_hba.conf文件配置hostssl条目。
hostssl all all 0.0.0.0/0 md5 clientcert=verify-ca
此时数据库连接使用ip地址或者hostname均可连接
opengauss数据库
gsql "sslcert=/home/omm/.postgresql/client.crt sslkey=/home/omm/.postgresql/client.key"
-h192.168.137.5 -p6432 -upostgres
password for user postgres:
warning: the client certificate will expire in 29 days.
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=>
使用hostname也可连接
gsql "sslcert=/home/omm/.postgresql/client.crt sslkey=/home/omm/.postgresql/client.key"
-hnodex -p6432 -upostgres
如果使用不正确的客户端证书,比如手工修改client.crt内容,测试会失败
postgresql数据库
psql "sslcert=/home/postgres/.postgresql/client.crt sslkey=/home/postgres/.postgresql/client.key" -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=# \q
使用hostname也可连接
psql "sslcert=/home/postgres/.postgresql/client.crt sslkey=/home/postgres/.postgresql/client.key" -hnode11
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=# \q
如果使用不正确的客户端证书,比如手工修改client.crt内容,测试会失败
psql "sslcert=/home/postgres/.postgresql/client.crt sslkey=/home/postgres/.postgresql/client.key" -h192.168.137.11
psql: error: ssl error: tlsv1 alert unknown ca
fatal: no pg_hba.conf entry for host "192.168.137.11", user "postgres", database "postgres", ssl off
分别使用ip地址及主机名测试clientcert=verify-ca选项,测试结果符合预期。
测试四
测试验证客户端证书及cn匹配用户或用户映射
pg_hba.conf文件配置hostssl条目。
hostssl all all 0.0.0.0/0 md5 clientcert=verify-full
此时数据库连接用户必须配置cn中配置的名称dbuser1
opengauss数据库
gsql "dbname=postgres sslcert=/home/omm/.postgresql/client.crt sslkey=/home/omm/.postgresql/client.key" -h192.168.137.5 -p6432 -udbuser1
上面使用dbuser1可以登录成功,如果使用其他用户也能登录成功。
postgresql数据库
psql "dbname=postgres sslcert=/home/postgres/.postgresql/client.crt sslkey=/home/postgres/.postgresql/client.key" -h192.168.137.11 -p6000 -udbuser1
上面使用dbuser1可以登录成功,如果使用其他用户比如postgres则会出现下面的错误提示。
psql: error: fatal: password authentication failed for user "postgres"
fatal: no pg_hba.conf entry for host "192.168.137.11", user "postgres", database "postgres", ssl off
测试五
测试cert免密认证:验证客户端证书及cn匹配用户或用户映射
pg_hba.conf文件配置hostssl条目。
hostssl all all 0.0.0.0/0 cert
此时数据库连接用户必须配置cn中配置的名称dbuser1,同时不需要输入密码。
opengauss数据库
gsql "dbname=postgres sslcert=/home/omm/.postgresql/client.crt sslkey=/home/omm/.postgresql/client.key" -h192.168.137.5 -p6432 -udbuser1
warning: the client certificate will expire in 29 days.
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=>
上面使用dbuser1用户可直接登录,不需要输入密码,如果使用其他用户比如postgres则会出现下面的错误提示。
warning: the client certificate will expire in 29 days.
gsql: fatal: certificate authentication failed for user "postgres"
fatal: no pg_hba.conf entry for host "192.168.137.5", user "postgres", database "postgres", ssl off
postgresql数据库
psql "dbname=postgres sslcert=/home/postgres/.postgresql/client.crt sslkey=/home/postgres/.postgresql/client.key"
-h192.168.137.11 -udbuser1
psql (12.6)
ssl connection (protocol: tlsv1.2, cipher: ecdhe-rsa-aes256-gcm-sha384, bits: 256, compression: off)
type "help" for help.
postgres=> \q
上面使用dbuser1用户可直接登录,不需要输入密码,如果使用其他用户比如postgres则会出现下面的错误提示。
psql: error: fatal: certificate authentication failed for user "postgres"
fatal: no pg_hba.conf entry for host "192.168.137.11", user "postgres", database "postgres", ssl off
总结
1.sslmode连接参数设置为verify-ca仅校验数据库证书真伪,设置为verify-full校验数据库证书真伪及通用名cn匹配数据库连接的hostname。
2.clientcert认证选项设置为verify-ca仅校验客户端证书真伪,设置为verify-full校验客户端证书真伪及通用名cn匹配数据库用户或用户映射。
3.使用clientcert认证选项时,连接类型可以设置为hostssl,但host类型也同时支持hostssl及hostnossl。
4.使用cert认证方法只能设置连接类型为hostssl。
5.客户端证书clientcert=verify-full认证方式,opengauss与postgresql有差异,参见测试四。