具有自签名证书的SSL POSTGRES连接

时间:2018-11-23 16:41:12

标签: postgresql ssl teamsql

我是SSL的新手,因此我首先阅读了许多教程,主题,论坛... 有很多信息,而且有点复杂。 我正在尝试在我的计算机和另一台服务器上的Postgresql实例之间建立SSL连接。为此,我已经逐步进行了工作。

  1. 检查两者之间的连接是否在没有SSL的情况下

    • 通过命令行连接自己:确定!

    psql“ hostaddr = X.X.X.X port = 5432 user = postgres dbname = my_db”

    • 通过数据库可视化工具(TeamSql,就像PgAdmin或MysqlWorkbench)连接自己:OK!
  2. 生成密钥和证书; 我已经在线上学习了一个教程(“ []”中的所有内容都是我隐藏的参数)

创建服务器密钥

openssl genrsa -des3 -out server.key 1024
chmod 400 server.key
chown postgres.postgres server.key
openssl req -new -key server.key -days 3650 -out server.crt -x509 -subj '/C=FR/ST=[MyCountry]/L=[MyCity]/O=[MyCompany]/CN=postgres/emailAddress=[my@email.com]'

假设根证书相同

cp server.crt root.crt

之后,生成客户端。首先,键

openssl genrsa -des3 -out /tmp/postgresql.key 1024

然后是企业社会责任

openssl req -new -key /tmp/postgresql.key -out /tmp/postgresql.csr -subj '/C=FR/ST=[MyCountry]/L=[MyCity]/O=[MyCompany]/CN=postgres'

最后是CRT

openssl x509 -req -in /tmp/postgresql.csr -CA root.crt -CAkey server.key -out /tmp/postgresql.crt -CAcreateserial
  1. 在服务器端激活SSL。 在PG_HBA.CONF文件中,添加特定的行以处理来自外部的SSL连接

enter image description here

在POSTGRESQL.CONF文件中,修改这些行:

listen_addresses = '*'
[...]
ssl = on
[...]
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'
  1. 检索我计算机上/home/user/.postgresql/文件夹中的postgresql.key,postgresql.crt和root.crt文件。 还更改了postgresql.key文件(600)的权限

  2. 再次尝试第一步。如果使用命令行,一切正常。但是使用可视化工具,即使激活了SSL选项(并使用相同的三个文件),也有两个结果:

    • ,“拒绝未经授权”选项设置为OFF:正在运行

    • “拒绝未经授权”选项设置为“开”:出现错误

  

主机名/ IP与证书的altname不匹配:“ IP:X.X.X.X不是   在证书列表中:“

(使用X.X.X.X我的服务器IP)

所以我的问题是:我一切都很好吗?为什么命令行连接和可视化工具之间存在差异? 证书生成可以吗?

当然,我不需要真正的CA认证。我正在寻找一个自签名的,但是即使我遵循了不同的教程,它仍然无法正常工作... 感谢您的帮助,祝您周末愉快

2 个答案:

答案 0 :(得分:0)

我相信这是因为 psql 将通过 SSL 连接而不验证证书,而 TeamSql 正在进行完整验证(据我所知,JDBC 中的默认设置)因此拒绝证书。

如果在 psql 中包含“sslmode=verify-full”标志,您应该得到与 TeamSql 相同的响应。

答案 1 :(得分:0)

<块引用>

openssl req -new ... CN=postgres ...

服务器证书中的 CN 应与客户端将用来寻址服务器的主机名(或 IP 地址)相匹配,在您的情况下为 X.X.X.X,而不是 postgres

或者,证书中的 SAN 可以匹配,但您没有使用任何 SAN。

psql 的默认设置是不检查证书中的 CN 或 SAN 是否与指定要连接的主机一致(在我看来这是一个非常糟糕的默认设置),这就是为什么它可以通过默认。

您应该重新制作服务器证书,以便在 CN 或 SAN 中包含主机名/IP 地址。或者,如果您不想这样做,请将“拒绝未经授权”设置为关闭。

此外,TeamSQL 似乎已不复存在。您可能希望切换到当前受支持且具有更好文档的其他工具。