首页 > 数据库 >openGauss与PostgreSQL对比测试SSL之自签名CA证书单向认证测试

openGauss与PostgreSQL对比测试SSL之自签名CA证书单向认证测试

时间:2024-04-11 11:03:41浏览次数:28  
标签:PostgreSQL crt 证书 之自 数据库 测试 root ca 客户端

openGauss 与 PostgreSQL 对比测试 SSL 之自签名 CA 证书单向认证测试
本文测试自签名 CA 证书的单向认证: 客户端只验证服务器证书的有效性,而服务器端不验证客户端证书的有效性。服务器加载证书信息并发送给客户端,客户端使用根证书来验证服务器端证书的有效性。

服务端证书的客户端认证模式
客户端 SSLMODE 设置为 verify-ca 仅校验数据库证书真伪。

客户端 SSLMODE 设置为 verify-full 校验数据库证书真伪及通用名 CN 匹配数据库连接的 hostname。

自签名 CA 证书单向认证测试
1.创建 CA 证书

CA 证书用于给数据库服务器证书签名,同时需要把 CA 证书发送给数据库客户端,客户端使用 CA 证书验证数据库服务器证书。

$ openssl req -new -x509 -days 365 -nodes
-config openssl.cnf
-out ca.crt -keyout ca.key -subj "/CN=FooCA"
2.生成数据库服务器证书请求文件

$ openssl req -new -nodes -text
-config openssl.cnf
-out server.csr
-keyout server.key
-subj "/CN=..."
将证书请求文件(包含用户信息)和证书签名分开操作,证书请求文件可重用,因为后面可能需要重新生成签名信息。

3.使用 CA 证书对证书请求文件签名

$ openssl x509 -req -in server.csr -text -days 5
-CA ca.crt
-CAkey ca.key
-CAcreateserial
-out server.crt
这里设置有效期为 5 天,可以观察在服务器证书有效期小于 7 天的时候,连接登录后会在日志中产生告警提醒。

4.传输数据库服务器证书及未加密的私钥文件至数据库服务器

修改文件权限以符合安全设置。

$ chmod 0600 server.crt server.key
传输文件到数据库服务器 PGDATA 目录。

$ cp server.crt server.key $PGDATA
注意:如果 PostgreSQL 使用-g, --allow-group-access

开启了组访问权限,则需要拷贝文件到 PGDATA 目录之外以符合安全设置。

5.数据库 SSL 参数配置

pg_hba.conf 文件配置 hostssl 条目,认证方法保持 md5 或者 scram 不变。

hostssl all all .../0 md5
说明:也可以按原来的 host 连接类型,同时支持非 ssl 和 ssl 连接,配置为 hostssl 只支持 hostssl,这里配置为 hostssl。

postgreql.conf 文件配置参数

ssl=on
ssl_cert_file= 'server.crt'
ssl_key_file= 'server.key'
然后重启数据库服务。

6.发送 CA 证书到数据库客户端

本文数据库客户端使用 linux 下 psql,证书文件的默认路径为$HOME/.postgresql/root.crt。

cat ca.crt > ~/.postgresql/root.crt
chmod 0600 ~/.postgresql/root.crt
测试一

数据库客户端未配置证书测试,删除上面第 6 步的文件。

openGauss

gsql "sslmode=verify-ca" -p6432 -h ... -Upostgres
gsql: root certificate file "/home/omm/.postgresql/root.crt" does not exist
Either provide the file or change sslmode to disable server certificate verification.
PostgreSQL

psql "sslmode=verify-ca" -h...
psql: error: root certificate file "/home/postgres/.postgresql/root.crt" does not exist
Either provide the file or change sslmode to disable server certificate verification.
可以看到设置 sslmode=verify-ca 后,客户端需要验证服务器证书,未配置默认 root.crt 问题,提示文件不存在,符合预期。

测试二

人为修改数据库客户端证书内容。

openGauss

gsql "sslmode=verify-ca" -p6432 -h ... -Upostgres
gsql: could not read root certificate file "/home/omm/.postgresql/root.crt": too long
gsql "sslmode=verify-ca" -p6432 -h ... -Upostgres
gsql: could not read root certificate file "/home/omm/.postgresql/root.crt": wrong tag
PostgreSQL

psql "sslmode=verify-ca" -h...
psql: error: could not read root certificate file "/home/postgres/.postgresql/root.crt":
bad base64 decode
psql "sslmode=verify-ca" -p7000 -h...
psql: error: could not read root certificate file "/home/postgres/.postgresql/root.crt": too long
可以看到 root.crt 证书文件内容如果被篡改也是有相应的报错提示,符合预期。

测试三

测试验证数据库服务器证书,将正确的证书文件发送至数据库客户端,参考上面第 6 步配置。

openGauss

gsql "sslmode=verify-ca" -p6432 -h ... -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" -h...
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 opengauss1 -Upostgres
gsql: server common name "..." does not match host name "opengauss1"
PostgreSQL

psql "sslmode=verify-full" -hnode11
psql: error: server certificate for "..." does not match host name "node11"
分别使用 ip 地址及主机名测试,与通用名 CN 匹配的 ip 地址可成功登录,使用主机名连接报错,报错提示如上,符合预期。

总结
1.数据库服务器证书的客户端认证需要在客户端配置服务器证书签名的 CA 证书,服务器设置支持 hostssl 连接,客户端使用 sslmode 连接参数。

2.sslmode 连接参数设置为 verify-ca 仅校验数据库证书真伪,设置为 verify-full 校验数据库证书真伪及通用名 CN 匹配数据库连接的 hostname。

标签:PostgreSQL,crt,证书,之自,数据库,测试,root,ca,客户端
From: https://www.cnblogs.com/helloopenGauss/p/18128385

相关文章

  • 基于junit的单元测试类编写
    首先定义抽象类BaseTest12345678910111213141516171819202122232425package com.geostar.gfstack.operationcenter.common.util; import com.google.gson.Gson;import com.google.gson.GsonBuilder;import org.junit.runner.RunWith;......
  • jdbc结合druid连接池访问postgreSQL数据库
    jdbc结合druid连接池访问postgreSQL数据库连接mysql的话也是一个道理,就是把对应的依赖和数据库驱动换一下一.在pom.xml里面加上对应的依赖<!--druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring......
  • DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!UI自动化测试利用特定的工具/框架来模拟用户与界面的......
  • 肖sir__jmeter 之接口测试16.0)
    一、实战1、jmeterpost请求(1)添加线程组  (2)添加http请求  (3)编辑http请求  (4)在监听器中添加查看结果树:如下  (5)运行接口  (6)断言  (5)断言内容  2、jmeterget请求  二、依赖关系的接口案例:1、登录接口url:POSThttp://cms.duoceshi.cn......
  • 软件工作四则运算测试
    沈阳航空航天大学软件工程第二次作业院(系):计算机学院专业:计算机科学与技术班级:-学号:-姓名:-带队教师:-2024年4月7日作业信息 沈阳航空航天大学计算机学院2024软件工程作业课程目标 熟悉一个“高质量”软件的开发过程作业目标 单元测试练习请......
  • 【测试开发学习历程】python迭代、可迭代对象、迭代器、生成器
    1迭代Iteration迭代Iteration:所谓迭代就是重复运行一段代码语句块的能力,就好比在一个容器中进行一层一层遍历数据,在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素,直到容器中没有元素为止。迭代迭代,更新换代,在上一次基础上更新成新的东西。#使用for循......
  • 【测试开发学习历程】python高阶函数
    目录1map()函数2reduce()函数3filter()函数4sorted()函数1map()函数map()函数语法:map(function,iterable)参数:function:函数iterable:一个或多个序列返回值:迭代器对象作用:map()是Python内置的高阶函数,它接收一个函数function和一个iterable,并通过把......
  • 【异常】写了很多单元测试用例,但是Sonar上显示的单元测试覆盖率依旧为 0.0%
    一、异常内容写了很多单元测试用例,但是Sonar上显示的单元测试覆盖率依旧为0.0%二、异常说明在SonarQube中显示单元测试覆盖率为0%,通常意味着SonarQube没有正确地接收到测试覆盖率报告。三、异常解决要解决这个问题,您可以按照以下步骤操作:3.1确保测试覆盖率报告已......
  • 请举出你在本小组项目的测试用例中,BICEP 是如何达到的?要写多少测试用例才够呢?
    BICEP可能代表以下四个方面:Behavior(行为):验证软件的功能表现是否符合预期,即输出结果是否正确。Interface(接口):检查系统与其他组件间的交互是否按照规格书定义正常运作。Constraints(约束):测试所有边界条件,包括合法边界、非法边界以及极端情况下的行为。ErrorHandling(错误处理):检......
  • 软件工程2-单元测试
    本次测试选择条件/判定覆盖,旨在设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断本身所有可能结果也至少执行一次。下面是几组测试用例对于条件/判定覆盖的构造方法:1.单个0的测试用例(deal0):输入数据:只有一个元素,值为0。预期结果:最大子数组和应该为0......