转自:https://blog.csdn.net/myneth/article/details/143722950
SSL说明
什么是SSL?
SSL的全名叫做Secure Socket Layer
(安全套接字层),最开始是由一家叫网景的互联网公司开发出来,主要是防止信息在互联网上传输的时候不被窃听或者篡改,后来网景公司提交SSL给ISOC组织做标准化,改名为TLS。
什么是openssl?
openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。
SSL双向认证和SSL单向认证的区别?
双向认证 SSL 协议要求服务器和用户双方都有证书。
单向认证 SSL 协议不需要客户拥有CA证书,服务器端不会验证客户证书,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的(这并不影响 SSL 过程的安全性)密码方案。
一般Web应用都是采用SSL单向认证的,无需在通讯层对用户身份进行验证,一般都在应用逻辑层来保证用户的合法登入。但如果是企业应用对接,可能会要求对客户端(相对而言)做身份验证。这时就需要做SSL双向认证。
单向认证和双向认证的区别仅在于创建连接阶段,数据的传输均为加密的,因此客户端与PG服务端的连接采取SSL单向认证即可,即仅在PG Server
端配置SSL证书。
前提条件:必须使用openssl来编译安装pg,否则后期不能启用ssl加密连接
查看postgresql是否使用openssl选项编译安装,没有则需重新编译:
- snippet.bash
[postgres@centos7 ~]$ pg_config|grep CONFIGURE|grep ssl CONFIGURE = '--prefix=/postgresql/pg12' '--with-openssl' [postgres@centos7 ~]$
在启用了–with-openssl
这个编译选项的情况下,ssl_library的参数值是OpenSSL,否则为空。
- snippet.sql
[postgres@centos7 ~]$ psql -c "select name,setting,unit,context from pg_settings where name ~* 'ssl_library';" name | setting | unit | context -------------+---------+------+---------- ssl_library | OpenSSL | | internal (1 ROW)
配置单向SSL认证连接
1、为服务器创建一个有效期为365天的简单自签名证书,创建服务端证书和私钥文件:
- snippet.bash
su - postgres mkdir ~/openssl openssl req -new -x509 -days 365 -nodes -text -subj '/CN=postgres' -out ~/openssl/server.crt -keyout ~/openssl/server.key chmod 600 ~/openssl/server.key
创建过程
- snippet.bash
[postgres@centos7 ~]$ mkdir ~/openssl [postgres@centos7 ~]$ openssl req -new -x509 -days 365 -nodes -text -subj '/CN=postgres' -out ~/openssl/server.crt -keyout ~/openssl/server.key Generating a 2048 bit RSA private key .............+++ .+++ writing new private key to '/home/postgres/openssl/server.key' ----- [postgres@centos7 ~]$ chmod 600 ~/openssl/server.key [postgres@centos7 ~]$ ll openssl/ total 8 -rw-rw-r-- 1 postgres postgres 4058 Nov 11 08:16 server.crt -rw------- 1 postgres postgres 1704 Nov 11 08:16 server.key [postgres@centos7 ~]$
2、修改postgreql.conf
配置文件
- snippet.bash
cat >> /postgresql/pgdata/postgresql.conf << "EOF" ssl = on ssl_cert_file = '/home/postgres/openssl/server.crt' ssl_key_file = '/home/postgres/openssl/server.key' EOF
参数说明
参数 | 说明 |
————— | ———————————————————— |
ssl | 支持SSL连接。默认是关闭的。这个参数只能在服务器启动时设置。SSL通信只能通过TCP/IP连接进行。 |
ssl_cert_file | 指定包含SSL服务器证书的文件的名称。默认是server.crt,相对路径相对于数据目录$PGDATA。此参数只能在服务器启动时设置。 |
ssl_key_file | 指定包含SSL服务器私钥的文件的名称。默认是server.key,相对路径相对于数据目录。此参数只能在服务器启动时设置。 |
要在SSL模式下启动,必须存在包含服务器证书和私钥的文件。默认情况下,这些文件将被命名为server.crt
和server.key
。但是可以使用配置参数ssl_cert_file
和ssl_key_file
指定其他名称和位置。
在linux系统中,server.key
必须禁止其他用户的访问权限。我们需要通过chown命令将server.key
的访问权限设置成600。
SSL打开后,此时服务器将侦听同一TCP端口上的正常连接和SSL连接,并与任何连接客户机协商是否使用SSL。
3、重启数据库,创建sslinfo扩展,验证ssl连接
- snippet.sql
pg_ctl START psql -c "create extension sslinfo;" [postgres@centos7 ~]$ psql -c "\dx" List OF installed extensions Name | Version | Schema | Description ---------+---------+------------+------------------------------------ plpgsql | 1.0 | pg_catalog | PL/pgSQL PROCEDURAL LANGUAGE sslinfo | 1.2 | public | information about SSL certificates (2 ROWS)
连接的时候需要加上-h
参数,否则不是以ssl连接的。
- snippet.sql
[postgres@centos7 ~]$ psql -U postgres psql (12.17) TYPE "help" FOR help. postgres=# SELECT ssl_is_used(); ssl_is_used ------------- f (1 ROW) postgres=# exit [postgres@centos7 ~]$ [postgres@centos7 ~]$ psql -h localhost psql (12.17) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) TYPE "help" FOR help. postgres=# SELECT ssl_is_used(); ssl_is_used ------------- t (1 ROW) postgres=# exit [postgres@centos7 ~]$ [postgres@centos7 ~]$ psql 'host=localhost user=postgres dbname=postgres password=postgres sslmode=require' psql (12.17) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) TYPE "help" FOR help. postgres=# SELECT ssl_is_used(); ssl_is_used ------------- t (1 ROW) postgres=# exit [postgres@centos7 ~]$
![]() | ![]() |