暂无图片
暂无图片
暂无图片

opengauss与postgresql对比测试ssl之自签名ca证书双向认证测试 -m6米乐安卓版下载

原创 多米爸比 2021-03-14
2138

续接下面两篇文章:
《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有差异,参见测试四。

最后修改时间:2022-10-23 09:55:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图