【问题标题】:SSL POSTGRES connection with self-signed certificate带有自签名证书的 SSL POSTGRES 连接
【发布时间】:2019-04-26 06:42:13
【问题描述】:

我是 SSL 新手,所以我从阅读大量教程、主题、论坛开始... 资料很多,有点复杂。 我正在尝试在我的计算机和不同服务器上的 Postgresql 实例之间建立 SSL 连接。为此,我一步一步地工作。

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

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

    psql "hostaddr=X.X.X.X port=5432 user=postgres dbname=my_db"

    • 通过数据库可视化工具(TeamSql,类似于 PgAdmin 或 MysqlWorkbench)连接自己:好的!
  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 连接

在 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 选项(并使用相同的三个文件),也会有两个结果:

    • 将“拒绝未经授权”选项设置为关闭:它正在工作

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

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

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

所以我的问题是:我做的一切都好吗?为什么命令行连接和可视化工具有区别? 证书生成可以吗?

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

【问题讨论】:

    标签: postgresql ssl teamsql


    【解决方案1】:

    我相信这是因为 psql 将通过 SSL 连接而不验证证书,并且 TeamSql 正在进行全面验证(据我所知,默认为 JDBC)所以拒绝证书。

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

    【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 2015-06-18
      • 1970-01-01
      • 2021-10-22
      • 2015-02-09
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多