我是SSL的新手,因此我首先阅读了许多教程,主题,论坛... 有很多信息,而且有点复杂。 我正在尝试在我的计算机和另一台服务器上的Postgresql实例之间建立SSL连接。为此,我已经逐步进行了工作。
检查两者之间的连接是否在没有SSL的情况下
psql“ hostaddr = X.X.X.X port = 5432 user = postgres dbname = my_db”
生成密钥和证书; 我已经在线上学习了一个教程(“ []”中的所有内容都是我隐藏的参数)
创建服务器密钥
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
在POSTGRESQL.CONF文件中,修改这些行:
listen_addresses = '*'
[...]
ssl = on
[...]
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
ssl_ca_file = 'root.crt'
检索我计算机上/home/user/.postgresql/文件夹中的postgresql.key,postgresql.crt和root.crt文件。 还更改了postgresql.key文件(600)的权限
再次尝试第一步。如果使用命令行,一切正常。但是使用可视化工具,即使激活了SSL选项(并使用相同的三个文件),也有两个结果:
,“拒绝未经授权”选项设置为OFF:正在运行
“拒绝未经授权”选项设置为“开”:出现错误
主机名/ IP与证书的altname不匹配:“ IP:X.X.X.X不是 在证书列表中:“
(使用X.X.X.X我的服务器IP)
所以我的问题是:我一切都很好吗?为什么命令行连接和可视化工具之间存在差异? 证书生成可以吗?
当然,我不需要真正的CA认证。我正在寻找一个自签名的,但是即使我遵循了不同的教程,它仍然无法正常工作... 感谢您的帮助,祝您周末愉快
答案 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 似乎已不复存在。您可能希望切换到当前受支持且具有更好文档的其他工具。