postgresql利用openssl实现网络数据传输加密 3ff8
2016-09-09 15:19
411 查看
通常情况下,postgresql服务端和客户端之间的数据传输是明文传送的,那这就有一定的安全隐患。怎么让数据通过密文的形式进行传输呢?可以利用openssl实现这一要求,但前提条件是服务端和客户端都要安装openssl工具包。在服务端安装好openssl之后,就可以利用openssl指令生成一对私钥和证书,用以对数据进行加解密,然后再对配置文件稍作修改就可以了。
1. 利用openssl生成私钥和证书,可以写成一个shell脚本来实现。
在执行脚本文件前,注意定义好data目录的环境变量。执行脚本后就会发现在data目录下生成两个文件:私钥server.key和证书server.crt。在shell脚本中需要对这两个密钥修改一下权限,否则数据库起动不了。
2. 修改postgresql.conf配置文件,打开ssl连接。
3. 修改pg_hba.conf配置文件,以hostssl方式连接。
4. 重启数据库,使配置生效。
5. psql -h localhost连接数据库,就可以看到提示是ssl连接。
这样利用openssl进行数据加密的环境就算搭好了。下面我们来通过抓包来测试一下。
1. 在数据库中新建一个表test,插入数据。
2. 用远程psql连接本地数据库。
3. 然后在服务端执行抓包命令。
4. 在远程psql端命令行执行一个查询语句。
5. 此时,会在服务端生成抓的一个包ssl.cap,利用wireshark对其进行解析,得到如下结果:
对比没有用openssl进行数据加密抓的包(过程不再叙述):
效果已经很明显了,传输数据确实被加密了。
1. 利用openssl生成私钥和证书,可以写成一个shell脚本来实现。
#!/bin/bash #/C -- Country Name #/ST -- Province Name #/L -- Locality Name (eg, city) #/O -- Organization Name (eg, company) #/CN -- Common Name (eg, your name or your server's hostname): openssl req -nodes -new -text -subj "/C=CH/ST=Shandong/L=Jinan/O=HighGo/CN=tbing" -out server.req openssl rsa -in privkey.pem -out $PGDATA/server.key rm privkey.pem openssl req -x509 -in server.req -text -key $PGDATA/server.key -out $PGDATA/server.crt rm server.req chown -R $LOGNAME $PGDATA/server.key $PGDATA/server.crt chmod 600 $PGDATA/server.key
在执行脚本文件前,注意定义好data目录的环境变量。执行脚本后就会发现在data目录下生成两个文件:私钥server.key和证书server.crt。在shell脚本中需要对这两个密钥修改一下权限,否则数据库起动不了。
2. 修改postgresql.conf配置文件,打开ssl连接。
ssl = on # (change requires restart) ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers # (change requires restart) ssl_prefer_server_ciphers = on # (change requires restart) ssl_ecdh_curve = 'prime256v1' # (change requires restart) ssl_cert_file = 'server.crt' # (change requires restart) ssl_key_file = 'server.key' # (change requires restart)
3. 修改pg_hba.conf配置文件,以hostssl方式连接。
hostssl all all 0.0.0.0/0 md5
4. 重启数据库,使配置生效。
5. psql -h localhost连接数据库,就可以看到提示是ssl连接。
psql (2.0.1) SSL连接 (加密:DHE-RSA-AES256-SHA,二进制位: 256)
这样利用openssl进行数据加密的环境就算搭好了。下面我们来通过抓包来测试一下。
1. 在数据库中新建一个表test,插入数据。
postgres=# create table test(n int); CREATE TABLE postgres=# insert into test select generate_series(1, 100); INSERT 0 100 postgres=#
2. 用远程psql连接本地数据库。
psql postgres -U postgres -W -h 192.168.100.120 -p 5432
3. 然后在服务端执行抓包命令。
tcpdump -t -s 0 -c 20 ip host 192.168.100.120 and 192.168.100.128 -w ./ssl.cap
4. 在远程psql端命令行执行一个查询语句。
select * from test;
5. 此时,会在服务端生成抓的一个包ssl.cap,利用wireshark对其进行解析,得到如下结果:
对比没有用openssl进行数据加密抓的包(过程不再叙述):
效果已经很明显了,传输数据确实被加密了。
相关文章推荐
- linux网络数据传输的加密,解密以及基于openssl的私有CA的建立
- C#实现网络传输数据加密
- 利用IPSec实现网络安全之三完结篇(身份验证和加密数据)
- C#实现网络传输数据加密
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计2
- Android利用Json来进行网络数据传输
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计1
- 使用Java实现网络传输数据的压缩
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务2
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室][使用IE浏览本页]
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计1[使用IE浏览本页]
- 利用剪贴板实现PB与Excel的中文数据传输
- 我有个简单网络传输加密的想法,但不会实现,请高手给出代码
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室][使用IE浏览本页]
- 计算机网络 曼彻斯特编码---牺牲数据传输速率--但能实现收发同步
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--类设计2[使用IE浏览本页]
- Linux下Java程序调用Openssl命令实现内存中加密数据
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1[使用IE浏览本页]
- 利用可传输表空间技术实现数据的高效迁移