首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有自签名证书的SSL POSTGRES连接

带有自签名证书的SSL POSTGRES连接
EN

Stack Overflow用户
提问于 2018-11-23 16:41:11
回答 2查看 4.5K关注 0票数 3

我是SSL的新手,所以我开始阅读很多教程,主题,论坛.有很多信息,而且有点复杂。我正在尝试在我的计算机和另一个服务器上的Postgresql实例之间建立SSL连接。为了做到这一点,我一步一步地工作。

  1. 检查两者之间的连接是否在不使用SSL的情况下工作。
代码语言:javascript
复制
- connect myself by command line: OK !

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

代码语言:javascript
复制
- connect myself by a DB visual tool (TeamSql, it's like PgAdmin or MysqlWorkbench): OK !

  1. 生成密钥和证书;我在网上遵循了一个教程( "[]“中的所有内容都是我隐藏的参数)

创建服务器密钥

代码语言:javascript
复制
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]'

假设根证书是相同的

代码语言:javascript
复制
cp server.crt root.crt

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

代码语言:javascript
复制
openssl genrsa -des3 -out /tmp/postgresql.key 1024

然后是企业社会责任

代码语言:javascript
复制
openssl req -new -key /tmp/postgresql.key -out /tmp/postgresql.csr -subj '/C=FR/ST=[MyCountry]/L=[MyCity]/O=[MyCompany]/CN=postgres'

最后是CRT

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

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

代码语言:javascript
复制
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选项(并使用相同的三个文件)时,也有两个结果:
代码语言:javascript
复制
- 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认证。我在找一个自我签名的,但即使我读过不同的教程,它还是没用的.谢谢你的帮助,周末愉快

EN

回答 2

Stack Overflow用户

发布于 2021-01-12 10:26:46

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

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

票数 0
EN

Stack Overflow用户

发布于 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似乎已经失效。您可能希望切换到当前支持并具有更好文档的另一个工具。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53450299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档