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 = on
ssl_ca_file = ''
ssl_cert_file = 'server.crt'
ssl_crl_file = ''
ssl_key_file = 'server.key'
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers
ssl_prefer_server_ciphers = on
ssl_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。
注意:
-
要在SSL模式下启动,必须包含服务器证书和私钥的文件。默认情况下,这些文件将被命名为server.crt和server.key。但是可以使用配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。
-
配置了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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2016-07-13 ST_SRID