pg采用ssl协议

转自https://www.csdn.net/tags/MtTaMg3sNTA4NTg5LWJsb2cO0O0O.html

2021-05-29 16:35:58

1、PostgreSql之SSL ?

PostgreSQL支持使用SSL连接加密客户端/服务器通信,以提高链路安全性。这要求在客户端和服务器系统上都安装OpenSSL,并且在构建时启用PostgreSQL中的ssl支持(使用源码安装时的--with-openssl参数)。

 

2、什么是OpenSSL?

OpenSSL是一个工具包,用于Transport Layer Security(TLS)和Secure Sockets Layer(SSL)协议。它也是一个通用的密码学库。

OpenSSL工具包包括:

  • libssl:是TLSv1.3以下所有TLS协议版本的实现。

  • Libcrypto:是一个通用密码库。它构成了TLS实现的基础,也可以单独使用。

  • openssl:openssl的命令行工具。

     

官网:https://www.openssl.org/

源码:https://gitee.com/mirrors/openssl

 

3、PG开启SSL?

 

在PG当前稳定版本(13.0)与ssl相关的参数有如下这些:

ssl = onssl_ca_file = ''ssl_cert_file = 'server.crt'ssl_crl_file = ''ssl_key_file = 'server.key'ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphersssl_prefer_server_ciphers = onssl_ecdh_curve = 'prime256v1'ssl_min_protocol_version = 'TLSv1.2'ssl_max_protocol_version = ''ssl_dh_params_file = ''ssl_passphrase_command = ''ssl_passphrase_command_supports_reload = off

见:https://www.postgresql.org/docs/13/runtime-config-connection.html

我们一般会配置ssl、ssl_cert_file、ssl_key_file这三个,其他的一般维持默认值。这是三个参数分别的含义如下:

  • ssl: 是否支持SSL连接。默认是关闭的。

  • ssl_cert_file:指定包含SSL服务器证书的文件的名称。默认是server.crt。相对路径相对于数据目录。

  • ssl_key_file:指定包含SSL服务器私钥的文件的名称。默认是server.key。相对路径相对于数据目录。

将ssl设置为on,即表示打开ssl。SSL打开后,此时服务器将侦听同一TCP端口上的正常连接和SSL连接,并与任何连接客户机协商是否使用SSL。

注意:

  1. 要在SSL模式下启动,必须包含服务器证书和私钥的文件。默认情况下,这些文件将被命名为server.crt和server.key。但是可以使用配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。

  2. 配置了SSL=on,并不代表会确保所有客户端总是通过SSL连接, 它只是表示允许使用SSL。如果想要确保所有连接都是用ssl, 还需要结合pg_hba.conf进行配置。比如添加类似“hostssl   all all 0.0.0.0/0 md5 \n hostnossl all all 0.0.0.0/0 reject” 这样的配置。
     

4、怎么生成server.crt和server.key?

上面我们提到开启ssl需要配置服务端证书和服务端私钥,即server.crt和server.key。那么怎么生成这两个文件呢?

首先是服务端证书类型来说,证书可以分为三类:

  • 自签名证书:自签名证书是没有由证书颁发机构(CA)签名的安全证书。

  • 建立本地根CA、再由根CA签发服务器证书:这种类型需要将本地根证书root.crt部署在客户端,PG客户端不依赖操作系统的证书,需要自行制定根证书的存放地方。

  • 公共CA签署的证书:一般用在有域名的服务器上。此类型需要客户端配置公共的root.crt。

 

下面我说一下前两种类型怎么做。

A、自签名证书

我们使用自签名证书进行测试创建自签名证书,需要借助openssl工具,命令:

openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=dbhost.yourdomain.com"

该命令会输出一个server.crt和一个server.key文件,证书有效期为365天。

B、建立本地根CA、再由根CA签发服务器证书。

我们可以用自签名证书做简单的测试。但是,要创建一个客户端可以验证其身份和来源的服务器证书,首先要创建一个证书签名请求和一个公钥/私钥文件:

openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=your-hostname.com"

生成root.crt。

openssl x509 -req -in root.csr -text -days 365 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -signkey root.key -out root.crt

使用这个新的root.crt创建服务端证书。

openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=your-hostname.com"

这种方法需要将root.crt配置在客户端,以便客户端可以验证服务器的证书是否由证书颁发结构签名。

 

5、PostgreSQL支持的SSL模式?

disable: 只尝试非SSL连接。

allow:首先尝试非SSL连接,若失败再尝试SSL连接。

prefer (default):首先尝试SSL连接,若失败再尝试非SSL连接。

require:只尝试SSL连接,若有根证书存在,等同于verify-ca。

verify-ca:只尝试SSL连接,并用根证书验证服务器证书是不是根CA签发的。

verify-full:只尝试SSL连接,并用根证书验证服务器证书是不是根CA签发的,且主题必须匹配连接域名或IP地址。

 

PG如何指定要使用的模式?

比如使用verify-ca:

psql "dbname=test host=10.xx.3.xx user=postgres password=1234 sslmode=verify-ca"

 

6、其他?

其实pg的ssl认证分为两部分,一是服务端ssl的认证,即客户端去验证服务端证书,这一种也是我们上面谈到的。二是客户端的ssl认证,即服务端去验证客户端的证书。这里就不展开说了。

 

7、扩展:什么是x509证书?

X509一般是指X.509。X.509是密码学里公钥证书的格式标准, 规定了数字证书的格式。

X.509证书含有公钥和标识(主机名、组织或个人),并由证书颁发机构(CA)签名(或自签名)。对于一份经由可信的证书签发机构签名(或者可以通过其它方式验证)的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,以及对文档进行数字签名。

更多信息见:https://blog.51cto.com/u_9843231/2466504

 

如果你注意到的话,上面我们在使用openssl申请证书时,就使用了x509。

 

 

 

 

 

参考:

https://www.postgresql.org/docs/current/ssl-tcp.html

https://blog.51cto.com/u_9843231/2466504

posted @ 2022-07-13 16:51  疯子110  阅读(215)  评论(0编辑  收藏  举报