Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据库PostrageSQL-用 SSL 进行安全的 TCP/IP 连接

数据库PostrageSQL-用 SSL 进行安全的 TCP/IP 连接

作者头像
cwl_java
发布于 2020-09-17 09:33:39
发布于 2020-09-17 09:33:39
1.4K00
代码可运行
举报
文章被收录于专栏:cwl_Javacwl_Java
运行总次数:0
代码可运行

18.9. 用 SSL 进行安全的 TCP/IP 连接

PostgreSQL 有一个对使用 SSL 连接加密客户端/服务器通讯的本地支持,它可以增加安全性。这个特性要求在客户端和服务器端都安装 OpenSSL 并且在编译 PostgreSQL 的时候打开这个支持(见Chapter 16)。

18.9.1. Basic Setup

当SSL支持被编译在PostgreSQL中时,可以通过将postgresql.conf中的 ssl设置为on让PostgreSQL服务器带着SSL支持被启动。 服务器在同一个 TCP 端口监听普通连接和SSL连接,并且将与任何正在连接的客户端协商是否使用SSL。默认情况下,这是客户端的选项,

关于如何设置服务器来要求某些或者所有连接使用SSL请见Section 20.1。要SSL模式中启动服务器,包含服务器证书和私钥的文件必须存在。默认情况下,这些文件应该分别被命名为server.crt和server.key并且被放在服务器的数据目录中,但是可以通过配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。

Unix 系统上,server.key上的权限必须不允许所有人或组的任何访问,通过命令chmod 0600 server.key可以做到。或者,该文件可以由root 所拥有并且具有组读访问(也就是0640权限)。这种设置适用于由操作系统管理证书和密钥文件的安装。用于运行PostgreSQL服务器的用户应该被作为能够访问那些证书和密钥文件的组成员。

如果数据目录允许组读取访问,则证书文件可能需要位于数据目录之外,以符合上面概述的安全要求。通常,启用组访问权限是为了允许非特权用户备份数据库,在这种情况下,备份软件将无法读取证书文件,并且可能会出错。

如果私钥被一个密码保护着,服务器将提示要求这个密码,并且在它被输入前不会启动。使用密码还会禁用在不重启服务器的情况下更改服务器的SSL配置的功能。 此外,密码保护的私钥在Windows上根本无法使用。

server.crt中的第一个证书必须是服务器的证书,因为它必须与服务器的私钥匹配。“intermediate”的证书颁发机构,也可以追加到文件。假设根证书和中间证书是使用v3_ca扩展名创建的,那么这样做避免了在客户端上存储中间证书的必要。这使得中间证书更容易到期。

无需将根证书添加到中server.crt。相反,客户端必须具有服务器证书链的根证书。

18.9.2. OpenSSL配置

PostgreSQL读取系统范围的OpenSSL配置文件。默认情况下,该文件被命名为openssl.cnf并位于openssl version -d报告的目录中。通过将环境变量设置OPENSSL_CONF为所需配置文件的名称,可以覆盖此默认值。

OpenSSL支持各种强度不同的密码和身份验证算法。虽然许多密码可以在OpenSSL的配置文件中被指定,您可以通过修改postgresql.conf配置文件中指定专门针对数据库服务器使用密码的ssl_ciphers 配置。

使用NULL-SHA或NULL-MD5可以得到身份验~ 证但没有加密开销。不过,中间人能够读取和传递客户端和服务器之间的通信。此外,加~ 密开销相比身份认证的开销是最小的。出于这些原因,我们建议不要使用 NULL 密码。

18.9.3. 使用客户端证书

要求客户端提供受信任的证书,把你信任的根证书颁发机构(CA)的证书放置在数据目录文件中。并且修改postgresql.conf中的参数ssl_ca_file到新的文件名,还要把认证选项clientcert=1加入到pg_hba.conf文件中合适的hostssl行上。然后将在 SSL 连接启动时从客户端请求该证书(一段对于如何在客户端设置证书的描述请见Section 34.18)。服务器将验证客户端的证书是由受信任的证书颁发机构之一签名。

如果希望避免将链接到现有根证书的中间证书显示在ssl_ca_file文件中(假设根证书和中间证书是使用 v3_ca 扩展名创建的),则这些证书也可以显示在ssl_ca_file 文件中。如果参数ssl_crl_file被设置,证书撤销列表(CRL)项也要被检查(显示 SSL 证书用法的图标见http://h41379.www4.hpe.com/doc/83final/ba554_90007/ch04s02.html)。

clientcert认证选项适用于所有的认证方法,但仅适用于pg_hba.conf中用hostssl指定的行。 当clientcert没有指定或设置为 0时,如果配置了 CA 文件,服务器将仍然会根据它验证任何提交的客户端证书 — 但是它将不会坚持要求出示一个客户端证书。

如果你在设置客户端证书,你可能希望用cert认证方法,这样证书控制用户认证以及提供连接安全。详见Section 20.12(在使用cert认证方法时,没有必要显式地指定clientcert=1)。

18.9.4. SSL 服务器文件用法

Table 18.2总结了与服务器上 SSL 配置有关的文件(显示的文件名是默认的名称。本地配置的名称可能会不同)。

Table 18.2. SSL 服务器文件用法

服务器在服务器启动时以及服务器配置重新加载时读取这些文件。在Windows系统上,只要为新客户端连接生成新的后端进程,它们也会重新读取。

如果在服务器启动时检测到这些文件中的错误,服务器将拒绝启动。但是,如果在配置重新加载过程中检测到错误,则会忽略这些文件,并继续使用旧的SSL配置。在Windows系统上,如果在后端启动时检测到这些文件中存在错误,则该后端将无法建立SSL连接。在所有这些情况下,错误情况都会在服务器日志中报告。

18.9.5. 创建证书

要为服务器创建一个有效期为365天的简单自签名证书,可以使用下面的OpenSSL命令,将dbhost.yourdomain.com替换为服务器的主机名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl req -new -x509 -days 365 -nodes -text -out server.crt \
 -keyout server.key -subj "/CN=dbhost.yourdomain.com"

然后执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chmod og-rwx server.key

如果文件的权限比这个更自由,服务器将拒绝该文件。要了解更多关于如何创建你的服务器私钥和证书的细节, 请参考OpenSSL文档。

尽管可以使用自签名证书进行测试,但是在生产中应该使用由证书颁发机构(CA)(通常是企业范围的根CA)签名的证书。

要创建其身份可以被客户端验证的服务器证书,请首先创建一个证书签名请求(CSR)和一个公共/专用密钥文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl req -new -nodes -text -out root.csr \
 -keyout root.key -subj "/CN=root.yourdomain.com"
chmod og-rwx root.key

然后,使用密钥对请求进行签名以创建根证书颁发机构(使用Linux上的默认OpenSSL配置文件位置):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl x509 -req -in root.csr -text -days 3650 \
 -extfile /etc/ssl/openssl.cnf -extensions v3_ca \
 -signkey root.key -out root.crt

最后,创建由新的根证书颁发机构签名的服务器证书:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl req -new -nodes -text -out server.csr \
 -keyout server.key -subj "/CN=dbhost.yourdomain.com"
chmod og-rwx server.key
openssl x509 -req -in server.csr -text -days 365 \
 -CA root.crt -CAkey root.key -CAcreateserial \
 -out server.crt

server.crt和server.key应该存储在服务器上,并且root.crt应该存储在客户端上,以便客户端可以验证服务器的叶证书已由其受信任的根证书签名。root.key应该离线存储以用于创建将来的证书。

也可以创建一个包括中间证书的信任链:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# root 
openssl req -new -nodes -text -out root.csr \
 -keyout root.key -subj "/CN=root.yourdomain.com"
chmod og-rwx root.key
openssl x509 -req -in root.csr -text -days 3650 \
 -extfile /etc/ssl/openssl.cnf -extensions v3_ca \
 -signkey root.key -out root.crt
# intermediate 
openssl req -new -nodes -text -out intermediate.csr \
 -keyout intermediate.key -subj "/CN=intermediate.yourdomain.com"
chmod og-rwx intermediate.key
openssl x509 -req -in intermediate.csr -text -days 1825 \
 -extfile /etc/ssl/openssl.cnf -extensions v3_ca \
 -CA root.crt -CAkey root.key -CAcreateserial \
 -out intermediate.crt
# leaf 
openssl req -new -nodes -text -out server.csr \
 -keyout server.key -subj "/CN=dbhost.yourdomain.com"
chmod og-rwx server.key
openssl x509 -req -in server.csr -text -days 365 \
 -CA intermediate.crt -CAkey intermediate.key -CAcreateserial \
 -out server.crt

server.crtintermediate.crt应连接成一个证书文件包中并存储在服务器上。server.key还应该存储在服务器上。root.crt应将其存储在客户端上,以便客户端可以验证服务器的叶证书是否已由链接到其受信任根证书的证书链签名。root.key和intermediate.key应离线存储以用于创建将来的证书。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go-https的简单实现
X.509 Certificate Signing Request (CSR) Management.
fnatic
2022/07/22
24.7K0
制作PFX证书
C:\Users\wood>openssl genrsa -des3 -out root.key Generating RSA private key, 2048 bit long modulus …………………………………………………………….+++ .+++ e is 65537 (0x10001) Enter pass phrase for root.key: Verifying – Enter pass phrase for root.key:
全栈程序员站长
2022/06/26
1.4K0
YashanDB分布式节点间SSL连接配置
分布式节点进行跨节点通信时既可能是主动连接的一方(视作SSL握手的客户端),也可能是被动连接的一方(视作SSL握手的服务端),因此每个节点都需要配置服务器私钥和服务器证书等相关参数。
用户10349277
2025/03/28
700
搭建hysteria2 服务端
https://raw.githubusercontent.com/chika0801/hysteria-install/main/config_server.yaml
HHTjim 部落格
2024/02/03
3K0
Https详解
https=http+SSL SSL:加密套接字 ssl加密使用openssl库 openssl : 1. ssl加密套件 2. https的通信 apt-get install openssl
对弈
2019/09/04
8590
nginx实现https网站设置(SSL证书生成配置)
1.https简介 HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据 2.https协议原理 首先,客户端与服务器建立连接,各自生成私钥和公钥,是不同的。服务器返给客户端一个公钥,然后客户端拿着这个公钥把要搜索的东西加密,称之为密文,并连并自己的公钥一起返回给服务器,服务器拿着自己的私钥解密密文,然后把响应到的数据用客户端的公钥加密,返回给客户端,客户端拿着自己的私钥解密密文,把数据呈现出来
全栈程序员站长
2022/06/29
5.8K0
nginx实现https网站设置(SSL证书生成配置)
SSL证书配置(https访问接口, 单向认证和双向认证)
参考文档 1. springboot项目配置阿里云ssl证书,http转https 2. Springboot配置使用ssl,使用https 3. Spring boot使用阿里云SSL证书报错:org/springframework/boot/context/properties/bind/Binder 4. IOException: Alias name tomcat does not identify a key entry 沃通证书部署问题解决办法
时间静止不是简史
2021/04/28
8.4K0
SSL证书配置(https访问接口, 单向认证和双向认证)
linux下生成openssl证书
下载安装openssl,进入/bin/下面,执行命令(把ssl目录下的openssl.cnf 拷贝到bin目录下) 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 [root@airwaySSL openssl]# cd ssl/ [root@airwaySSL ssl]# pwd /home/openssl/ssl [root@airwaySSL ssl]# ls certs  man  misc  openssl.cnf  private  server.csr  server.key 运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施! 去除key文件口令的命令: openssl rsa -in server.key -out server.key 2.openssl req -new -key server.key -out server.csr -config openssl.cnf [root@airwaySSL bin]# openssl req -new -key server.key -out server.csr -config openssl.cnf Enter pass phrase for server.key:12345 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:china Locality Name (eg, city) []:wuhan Organization Name (eg, company) [Internet Widgits Pty Ltd]:airway Organizational Unit Name (eg, section) []:airway Common Name (eg, YOUR name) []:airway Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: 生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可. 3.对客户端也作同样的命令生成key及csr文件: openssl genrsa -des3 -out client.key 1024 Generating RSA private key, 1024 bit long modulus ...........++++++ ..++++++ e is 65537 (0x10001) Enter pass phrase for client.key:12345 Verifying - Enter pass phrase for client.key:12345 openssl req -new -key client.key -out client.csr -config openssl.cnf [root@airwaySSL bin]# openssl req -new -key client.key -out client.csr -config openssl.cnf Enter pass phrase for client.key:1234
DevinGeng
2019/04/09
3.5K0
自签名SSL证书的创建与管理
创建自签名根根证书过程:生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)(CA给自已颁发的证书)
行者深蓝
2024/07/14
1.1K0
使用 openssl 生成证书(含openssl详解)
openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。 官网:https://www.openssl.org/source/
菲宇
2019/06/12
18.8K0
使用 openssl 生成证书(含openssl详解)
自制CA证书设置ssl证书
注意,这里的 Organization Name (eg, company) [Internet Widgits Pty Ltd]: 后面生成客户端和服务器端证书的时候也需要填写,O和OU不要写成一样的!!!
聂伟星
2020/08/14
6.1K0
利用OpenSSL签署多域名证书
openssl自建CA默认签署的是单域名证书,因为单台服务器上有多个https域名,签署多域名证书能方便很多,今天找了很久,除了一些卖证书的网站上有scr工具能加“使用者备用名称”,都没有找到openssl相关的添加方法。
星哥玩云
2022/07/03
1.8K0
SSL 证书生成
生成CA私钥(.key)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt)(CA给自已颁发的证书)。
为为为什么
2022/08/06
2.4K0
postgresql配置ssl加密
设计一个安全的数据库集群环境是非常重要的,特别是在处理敏感或者重要数据时。通过配置SSL加密,我们可以保证数据在传输过程中的安全。在这个方案中,我们将侧重于为PostgreSQL数据库流复制集群配置SSL加密。
运维开发王义杰
2023/10/30
7610
postgresql配置ssl加密
Harbor 镜像仓库部署
解压 Harboe 离线安装包后,进入解压后的目录,编辑 harbor.yaml 文件
星哥玩云
2022/09/15
1.1K0
Linux下制作HTTPS证书
openssl genrsa -out keys/RootCA.key 2048
Learning_斌
2019/09/05
6.5K0
harbor搭建企业docker私有镜像仓库
# curl -fsSL https://get.docker.com/ | sh
聂伟星
2020/07/12
2.8K0
SSL泄露源站IP解决方法
我们上一篇文章中聊到了SMTP会泄露源站ip的问题,那么我们今天再来说一个泄露源站IP的点。那就是:
小N同学
2022/04/06
1.6K0
SSL泄露源站IP解决方法
Golang(十一)TLS 相关知识(二)OpenSSL 生成证书
0. 前言 接前一篇文章,上篇文章我们介绍了数字签名、数字证书等基本概念和原理 本篇我们尝试自己生成证书 参考文献:TLS完全指南(二):OpenSSL操作指南 1. OpenSSL 简介 OpenSSL 是一个开源项目,其组成主要包括三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls OpenSSL 主要用于秘钥证书管理、对称加密和非对称加密 1.1 指令 常用指令包括:genrsa、req、x509 1.1.1 genrs
西凉风雷
2022/11/23
2.4K0
PKI - 借助Nginx 实现Https_使用CA签发证书
总之,使用 CA 签发证书可以确保通信的安全性、可靠性和完整性,为网络通信提供了重要的保护和信任基础。
小小工匠
2024/05/26
3820
PKI - 借助Nginx 实现Https_使用CA签发证书
相关推荐
go-https的简单实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档