文档章节

PostgreSQL SSL启用与CA证书生成、配置

YuanyuanL
 YuanyuanL
发布于 01/23 16:54
字数 1371
阅读 9
收藏 0

ref: https://yq.aliyun.com/articles/14965

 

PG服务器配置SSL证书验证

在CA服务器(测试中与PG服务器同一台)

1.生成CA私钥证书(此处名为trustly-ca.key)

su - root

mkdir -p /opt/ssl/private

openssl genrsa -des3 -out /etc/ssl/private/trustly-ca.key 2048 
#需两次输入密码,测试时输入postgres,生成文件trustly-ca.key

chown root:root /opt/ssl/private/trustly-ca.key
chmod 400 /opt/private/trustly-ca.key

#查看私钥属性和内容
file /opt/ssl/private/trustly-ca.key 
/opt/ssl/private/trustly-ca.key: PEM RSA private key

cat /opt/ssl/private/trustly-ca.key 

2.生成CA公共证书(此处名为trustly-ca.crt)

mkdir -p /opt/ssl/share/ca-certificates

openssl req -new -x509 -days 3650 \
> -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=Skymobi/CN=trustly' \
> -key /etc/ssl/private/trustly-ca.key \
> -out /opt/ssl/share/ca-certificates/trustly-ca.crt
   Enter pass phrase for /opt/ssl/private/trustly-ca.key: 输入私钥的pass phrase: postgres

查看公共证书属性和内容
file /opt/ssl/share/ca-certificates/trustly-ca.crt
   /opt/ssl/share/ca-certificates/trustly-ca.crt: PEM certificate

cat /opt/ssl/share/ca-certificates/trustly-ca.crt

在PG服务器

3.生成PG服务器私钥

在PG服务器PGDATA目录生成证书文件:

server.key
server.crt
root.crt #containing the CA for the server certificate, plus your client certificate (postgresql.crt)

生成server.key

su - postgres

#生成server.key
openssl genrsa -des3 -out $PGDATA/server.key 2048
#需两次输入密码,测试中使用postgres

#移除pass phrase, 为了方便做自启动脚本, 不然的话数据库启动时又要提示你输入pass phrase.
openssl rsa -in $PGDATA/server.key -out $PGDATA/server.key
  Enter pass phrase for /pgdata1999/server.key: 输入postgres
  writing RSA key

#修改文件权限
chmod 400 server.key

#查看文件属性和内容
file server.key 
   server.key: PEM RSA private key

cat server.key 

生成server.csr

#请求文件签名
openssl req -new -nodes -key $PGDATA/server.key -days 3650 \
> -out $PGDATA/server.csr \
> -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=Skymobi/CN=pgserver'

file server.csr
  server.csr: PEM certificate request

生成server.crt

#使用CA证书进行签名
openssl req -x509 -key /opt/ssl/private/trustly-ca.key \
> -in $PGDATA/server.csr \
> -out $PGDATA/server.crt
Enter pass phrase for /etc/ssl/private/trustly-ca.key: 输入postgres

file server.crt
server.crt: PEM certificate

cat server.crt

生成root.crt

cp server.crt root.crt

#将/opt/ssl/share/ca-certificates/trustly-ca.crt内容添加到root.crt末尾,合成root.crt
cat root.crt

4 在postgresql.conf中配置:

ssl = on

ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'

5 在pg_hba.conf中配置:

#IPv4 local connections:
hostssl all all 0.0.0.0/0 cert clientcert=1

6 重启数据库服务

$PGBIN/pg_ctl restart -D ../data

7 PLSQL连接测试

./psql postgresql://client1:client1@192.168.90.170:5432/postgres?sslmode=verify-ca
psql.bin (10.4)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

 

 

为客户端配置证书

客户端证书缺省引用地址(也可指定到其他位置)

win:%APPDATA%postgresql/
*nix:~/.postgresql/

如:
win10: C:\Users\highgoer\AppData\Roaming\postgresql
centos7: /opt/PostgreSQL/10/.postgresql/

 

PLSQL(libpq)客户端所需证书文件

需要三个证书
posgresql.crt
posgresql.csr
posgresql.key


centos7下生成证书步骤:
su -postgres

##创建默认路径~/.postgresql
mkdir ~/.postgresql
chmod 700 .postgresql

##生成postgresql.key
openssl genrsa -des3 -out ~/.postgresql/postgresql.key 1024
#需两次输入密码,测试时使用postgres

#如果不想每次新建连接都提示输入pass phrase, 可以删除pass phrase, 但是你要知道这样降低了安全性 : 
pg92@db-172-16-3-39-> openssl rsa -in ~/.postgresql/postgresql.key -out ~/.postgresql/postgresql.key
Enter pass phrase for /home/pg92/.postgresql/postgresql.key: 输入postgres
writing RSA key

file postgresql.key
cat postgresql.key 

chmod 400 postgresql.key


##生成postgresql.csr
openssl req -new -key ~/.postgresql/postgresql.key -out ~/.postgresql/postgresql.csr \
> -subj '/C=CN/ST=Zhejiang/L=Hangzhou/O=Skymobi/CN=client1'
#使用CA证书进行签名
openssl x509 -req -in /tmp/postgresql.csr \
> -CA /opt/ssl/share/ca-certificates/trustly-ca.crt \
> -CAkey /opt/ssl/private/trustly-ca.key \
> -out ~/.postgresql/postgresql.crt \
> -CAcreateserial
Signature ok
subject=/C=CN/ST=Zhejiang/L=Hangzhou/O=Skymobi/CN=client1
Getting CA Private Key
Enter pass phrase for /etc/ssl/private/trustly-ca.key: 输入pass phrase : postgres

file postgresql.crt 
   postgresql.crt: PEM certificate
cat postgresql.crt 


PLSQL客户端连接:
首先需要创建数据库登录用户client1,因为之前postgresql.csr生成时指定的CN=client1,需要和登录用户匹配才能连接。
create role client1 login encrypted password 'client1';

./psql postgresql://client1:client1@192.168.90.170:5432/postgres?sslmode=verify-ca
psql.bin (10.4)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> \q

常见错误:

./psql postgresql://client1:client1@192.168.90.170:5432/postgres?sslmode=verify-full
psql.bin: root certificate file "/opt/PostgreSQL/10/.postgresql/root.crt" does not exist
Either provide the file or change sslmode to disable server certificate verification.

解决办法:使用安全级别低于verify-full的sslmode,或者将$PGDATA下的root.crt拷贝到~/.postgresql/目录下。



./psql postgresql://client1:client1@192.168.90.170:5432/postgres?sslmode=verify-full
psql.bin: server certificate for "pgserver" does not match host name "192.168.90.170"

官方文档: https://www.postgresql.org/docs/10/libpq-ssl.html
 If the parameter sslmode is set to verify-ca, libpq will verify that the server is trustworthy by checking the certificate chain up to the root certificate stored on the client. If sslmode is set to verify-full, libpq will also verify that the server host name matches the name stored in the server certificate. The SSL connection will fail if the server certificate cannot be verified. verify-full is recommended in most security-sensitive environments.

解决办法:host name=192.168.90.170与CN=pgserver不匹配导致的错误。
请注意:Common Name (e.g. server FQDN or YOUR name) []该值为客户端连接服务器时如果用IP,就写IP,如果用域名,就写域名,不然客户端验证域会失败)。

 

Java(JDBC)客户端所需证书文件

1.posgresql.crt

在PG服务器 /opt/PostgreSQL/10/.postgresql/

2.postgresql.pk8

在PG服务器

cd /opt/PostgreSQL/10/.postgresql/

openssl pkcs8 -topk8 -outform DER -in postgresql.key -out postgresql.pk8 -nocrypt

3.root.crt (only needed when sslmode is verify-ca or verift-full)

在PG服务器 /opt/PostgreSQL/10/data/

4.Java客户端通过JDBC访问PG数据库服务器

 public static void getConnection(String url, String user, String pwd, boolean onSSL) throws ClassNotFoundException, SQLException
    {
        String driver = "org.postgresql.Driver";
        Class.forName(driver);

        Properties props = new Properties();
        props.setProperty("user", user);
        props.setProperty("password", pwd);
        if (onSSL)
        {
            //props.setProperty("ssl", "true");//equal to sslmode=verify-full 
            props.setProperty("sslfactory", "org.postgresql.ssl.jdbc4.LibPQFactory");//sslmode=verify-ca OR verify-full 
            props.setProperty("sslmode", "verify-ca");           
                        
            //deafult dir: C:\Users\highgoer\AppData\Roaming\postgresql\ 
            //props.setProperty("sslcert", "C:/Users/highgoer/AppData/postgresql/postgresql.crt");
            //props.setProperty("sslkey", "C:/Users/highgoer/AppData/postgresql/postgresql.key");
            //props.setProperty("sslrootcert", "C:/Users/highgoer/AppData/postgresql/root.crt");
            
            System.err.println("****** sslmode=" + props.getProperty("sslmode"));
        }
        Connection conn = DriverManager.getConnection(url, props);
    }


 

 

© 著作权归作者所有

共有 人打赏支持
YuanyuanL

YuanyuanL

粉丝 153
博文 325
码字总数 190992
作品 0
济南
部门经理
私信 提问
使用 hostssl cert clientcert = 1 来强化 PostgreSQL 的安全性

在经历了多次的摸索实验后我终于成功地实现了SSL证书认证的功能,因此我想这次我要把这些步骤记录下来供日后查阅。 出于安全和方便的原因,我要在一台单独的专用机器上签署客户的证书,这台机...

oschina
2013/04/28
728
0
PostgreSQL 数据库的整体安全性

数据库安全性是如今基于 Web 的应用程序面对的最大挑战。如果不加以控制,您将面临公司敏感信息被曝光的风险,更糟糕的是,珍贵的客户信息也将面临被泄露的风险。在本文中,了解可以用来保护...

小编辑
2009/12/25
2.6K
3
18.9. 用 SSL 进行安全的 TCP/IP 连接

18.9. 用 SSL 进行安全的 TCP/IP 连接 PostgreSQL有一个对使用SSL连接加密客户端/服务器通讯的本地支持,它可以增加安全性。这个特性要求在客户端和服务器端都安装OpenSSL并且在编译Postgre...

机器的心脏
2018/10/02
0
0
apigateway-kong(一)简介及部署

   最近搭建一个api-gateway服务,随着后端restful api不断增加, 权限控制,安全,负载均衡,请求分发,监控等都成了问题 为什么使用API-Gateway   1. 方便客户端维护-- 每个请求方不用...

zhoujie0111
2018/05/22
0
0
Kong API Gateway 配置文件详解

一、前言 Kong配置文件是Kong服务的核心文件,它配置了Kong以怎么的方式运行,并且依赖于这个配置生成Nginx的配置文件,本文通过解读Kong配置文件,以了解Kong的运行和配置。 在成功安装Kon...

数据架构师
01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MaxCompute,基于Serverless的高可用大数据服务

摘要:2019年1月18日,由阿里巴巴MaxCompute开发者社区和阿里云栖社区联合主办的“阿里云栖开发者沙龙大数据技术专场”走近北京联合大学,本次技术沙龙上,阿里巴巴高级技术专家吴永明为大家...

zhaowei121
29分钟前
4
0
记录一下安装使用MySql8.0以及允许Navicat11远程连接

记录一下安装使用MySql8.0以及允许Navicat11远程连接 2018年05月11日 23:51:39 爱不离此 阅读数:4455 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_352...

linjin200
29分钟前
2
0
redis结合springboot 无法注入redisTemplate问题

redis结合springboot 无法注入redisTemplate问题 报错: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.......

BraveLN
31分钟前
2
0
Redis缓存雪崩、缓存穿透、热点Key解决方案和分析

缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力。 (查询一个必然不存在的数据。比如文章表,查询一个不存...

watermelon11
33分钟前
2
0
ThinkSNS + 后端2019年1月更新播报

社交软件系统ThinkSNS+界面一览图 研发发布版本号:2.1.5 和 2.2.2 更新发布时间:2019年1月29日 社交系统ThinkSNS+后端本次主要更新内容:搜索地区体验优化、优化收藏页面排版、修正读取兑换...

ThinkSNS官方帐号
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部