gaussdb 数据库用户和安全管理【用openssl生成SSL证书的流程】【05】

1. 相关概念

 
对称加密:通过加密文件进行加密数据,使用相同的加密文件进行解密数据。
非对称加密:通过加密文件进行加密数据,使用另一个加密文件进行解密数据。


加密解密:公钥和私钥都可以用来加密数据,使用公钥加密数据,然后私钥解密的情况称为加密解密。
签名、验证签名:使用私钥加密数据,公钥解密一般被称为签名和验证签名。

说明:

  • 使用公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给其他人,让别人加密他想要传送给你的数据,这个数据只有到了有私钥的你这里,才可以解开有用的数据。同理,如果你用你的私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的。相反,则不是。这个被称为签名。

  • 实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密。他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性。


非对称加密相关算法

RSA:可以用于加密、解密。也可以用于签名验签。
DSA:只能用于签名。
SHA/MD5:不是用于加密解密或者签名的,它被称为摘要算法。依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系。但是,这个摘要是不能还原成原数据的。

说明:

  • SHA/MD5加密实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力。所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的摘要值一起传给你。这样你解开加密后的摘要值,再和你得到的数据的摘要值对比一下,就可以知道数据有没有被修改了。

公证方 CA

问题:一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密数据。但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的私钥解密看到数据了吗?

答复:为了解决这个问题,需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的,这就是CA。CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA。CA用自己的私钥进行加密,这里也可以称为签名。然后这个包含了你的公钥和你的信息的文件就可以称为证书文件。这样一来所有得到一些公钥文件的人。可以通过CA的公钥解密文件。如果正常解密那么解密后里面的信息一定是真的,因为加密方只可能是CA。这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了。

扫描二维码关注公众号,回复: 12262710 查看本文章

实际应用中,一般人都不会找CA去签名。因为那是收钱的,所以可以自己做一个自签名的证书文件。就是自己生成一对密钥,然后再用自己生成的另外一对密钥对这对密钥进行签名。这个只用于真正需要签名证书的人。普通的加密解密数据,直接用公钥和私钥来做就可以了。


后缀名格式说明

后缀名格式 描述
key 私有的密钥
crt 证书文件,certificate的缩写
csr 证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
crl 证书吊销列表,Certificate Revocation List的缩写
pem 用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
crt.pem 可导出证书

2. CA根证书的生成步骤

  • 生成CA私钥(.key)
  • 生成CA证书请求(.csr)
  • 自签名得到根证书(.crt)(CA给自已颁发的证书)
openssl genrsa -out ca.key 2048 
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

在实际的软件开发工作中,往往服务器就采用这种自签名的方式,因为毕竟找第三方签名机构是要给钱的,也是需要花时间的。

3. 用户证书的生成步骤

  • 生成私钥(.key)
  • 生成证书请求(.csr)
  • 用CA根证书签名得到证书(.crt)

服务端用户证书

openssl genrsa -des3 -out server.key 1024 
openssl req -new -key server.key -out server.csr
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key 

客户端用户证书

openssl genrsa -des3 -out client.key 1024 
openssl req -new -key client.key -out client.csr
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

生成pem格式证书
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成

cat client.crt client.key > client.pem
cat server.crt server.key > server.pem

结果
服务端证书:ca.crt,server.key,server.crt,server.pem
客户端证书:ca.crt,client.key,client.crt,client.pem

4. 用另一种方式生成SSL证书

01. 生成自己的CA
在 openssl 安装目录的misc 目录下(或者在apps 目录下),运行脚本:./CA.sh -newca(Windows 环境下运行:perl ca.pl -newca),出现提示符时(要求输入密码+信息)。运行完毕后会生成一个demonCA 的目录,里面包含了ca 证书及其私钥。

./CA.sh -newca
  • 运行这个命令后,会提示输入密码,该过程是产生 CA 密钥对,用于对证书请求签名,需要牢记。
  • 1024、RSA字样代表使用RSA算法生成1024位长度的密钥。如果需要增强密钥强度(如产生2048位密钥),通过更改/usr/ssl/openssl.cnf中的default_bits字段为2048即可。
  • 有一点很重要,后续产生服务器端证书或者客户端证书时,需要保证填入的信息与CA的一致,否则会签发不成功。

02. 生成客户端和服务端证书申请

产生证书申请:

openssl req -newkey rsa:1024 -out req2.pem -keyout server.key
  • 需要用户补充证书的信息,此时需要与CA证书的基本信息一致。否则会导致签名失败。
  • 在实际应用中,用户可以通过向知名 CA 递交证书请求来申请证书。但是在这里,我们需要建立的是一个根 CA ,只能由我们自己来对证书请求进行签名。所以我们让 OpenSSL 使用证书请求中附带的密钥对对该请求进行签名,也就是所谓的“self sign ”。

03. 签发证书

签发证书:

openssl ca -in req2.pem -out server.crt
  • 使用产生的CA证书签发服务器证书请求,需要输入CA的密钥,有“Data Base Update”字样,代表证书已经签发成功。

04. 密钥文件口令的处理

在步骤2)中使用以下命令产生证书申请时,会同时产生私钥文件:

openssl req -newkey rsa:1024 -out req2.pem -keyout server.key

运行时会提示输入密码,此密码用于加密key文件,以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令,如果该文件的存储环境足够安全,或者采取了其他的保护措施,也可以移除对该文件的口令保护。移除口令保护的命令为:

openssl rsa -in server.key -out server.key

如果不移除口令保护,为了GaussDB能成功加载该文件,可以通过GaussDB的gs_guc工具,设置密钥文件的保护口令。以密钥文件的口令为gaussdb@123为例,运行以下命令即可:

gs_guc encrypt –M server –K gaussdb@123

05. 签发证书失败

问题1:在签发证书时,即便证书信息正确,也不会输出代表签发成功的“Data Base Update”字样,大部分情况下会有“failed to update database”这样的字样。

解决这个问题有以下两种方法:
方法一:
修改demoCA下 index.txt.attr
将unique_subject = yes改为unique_subject = no
方法二:
删除demoCA下的index.txt,并再touch下
rm index.txt
touch index.txt

问题2:出现“No such file or directory”字样的错误。

这类错误一般都是因为执行命令的路径不正确的原因,针对以上的错误,通过观察当前路径下是否有demoCA便可知晓。如果没有,切换一下路径便可解决。

5. gaussdb的SSL相关设置

GaussDB服务器端ssl功能相关参数及配置说明

ssl = off                              # (change requires restart)
ssl_cert_file = 'server.crt'           # (change requires restart)
ssl_key_file = 'server.key'            # (change requires restart)
ssl_ca_file = ''                       # (change requires restart)
ssl_crl_file = ''

如果要使用ssl功能,首先需要设置ssl=on,并且将服务器端证书和私钥文件拷贝到data目录下(证书和私钥文件默认命名为server.crt和server.key,否则需要修改ssl_cert_file和ssl_key_file的值),私钥文件要求权限不能大于0600,否则会启动失败。

客户端ssl功能相关环境变量及配置说明
PGSSLCERT、PGSSLKEY、PGSSLROOTCERT、PGSSLCRL、PGSSLMODE。具体函数及设置方法如下:

gaussdb 数据库用户和安全管理【用SSL进行安全的TCP/IP连接】【04】
https://blog.csdn.net/qq_42226855/article/details/109565179

配置ssl鉴权链路
当配置了ssl功能后,可以在pg_hba.conf中配置哪些链路通过ssl鉴权和加密传输,哪些链路不能使用ssl鉴权和加密传输等。

gaussdb 数据库用户和安全管理【客户端接入认证】【02】
https://blog.csdn.net/qq_42226855/article/details/109563367

检查相关设置

  • 主备数据库强制ssl通信。所以证书过期会影响双机同步,需替换ssl证书。
  • gsql -d dbname -U username -W password -h floatip -p port ,说明使用了证书。
SSL connection (cipher: AES256-SHA, bits: 256)
Type "help" for help.

XXXXXX=>
  • 查看配置文件中的证书名与证书CN值是否一致
grep repl_force postgresql.conf 
repl_force_cert_check = ''
  • 查看证书CN值
openssl x509 -in server.crt -text

相关参考
gaussdb 数据库用户和安全管理【用SSL进行安全的TCP/IP连接】【04】
https://blog.csdn.net/qq_42226855/article/details/109565179

猜你喜欢

转载自blog.csdn.net/qq_42226855/article/details/109578424