我是SSL的新手,所以我开始阅读很多教程,主题,论坛.有很多信息,而且有点复杂。我正在尝试在我的计算机和另一个服务器上的Postgresql实例之间建立SSL连接。为了做到这一点,我一步一步地工作。
- connect myself by command line: OK !“hostaddr=X.X port=5432 user=postgres dbname=my_db”
- connect myself by a DB visual tool (TeamSql, it's like PgAdmin or MysqlWorkbench): OK !
创建服务器密钥
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'- with "Reject Unauthorized" option set to OFF: it's working
- with "Reject Unauthorized" option set to ON: got an error
主机名/IP不匹配证书的altname:"IP: x.x不在证书列表中:“
(使用X.X我的服务器IP)
所以我的问题是:我做的一切都很好吗?为什么命令行连接和可视化工具连接有区别?证书生成正常吗?
当然,我不想要真正的CA认证。我在找一个自我签名的,但即使我读过不同的教程,它还是没用的.谢谢你的帮助,周末愉快
发布于 2021-01-12 10:26:46
我相信这是因为psql将在不验证证书的情况下通过SSL连接,而TeamSql正在进行完全验证(据我所知,在JDBC中默认),因此拒绝证书也是如此。
如果您在psql中包含了“sslmode=verify”标志,那么您应该得到与TeamSql相同的响应。
发布于 2021-01-12 17:39:18
openssl req -new ..。CN=postgres ...
服务器证书中的CN应该与服务器将由客户端寻址的主机名(或IP地址)相匹配,在您的示例中,客户机将是X.X.X.X,而不是postgres。
或者,证书中的SAN可以匹配,但是您没有使用任何SAN。
psql的默认设置不是检查cert中的CN或SAN是否与指定连接的主机一致(我认为这是一个非常糟糕的默认设置),这就是为什么默认情况下这一默认情况。
您应该重新制作服务器证书,以便它在CN或SAN中包含主机名/IP地址。或者,如果您不想这样做,那么将“拒绝未经授权”设置为off。
此外,TeamSQL似乎已经失效。您可能希望切换到当前支持并具有更好文档的另一个工具。
https://stackoverflow.com/questions/53450299
复制相似问题