![使用 openssl 升级/更新 Postgres SSL 服务器证书](https://linux22.com/image/775743/%E4%BD%BF%E7%94%A8%20openssl%20%E5%8D%87%E7%BA%A7%2F%E6%9B%B4%E6%96%B0%20Postgres%20SSL%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AF%81%E4%B9%A6.png)
我继承了带有 SSL 客户端的公司 Postgres 服务器。到目前为止,它大约有 100 个用户。
两个问题:我的 Ca 证书(root.crt)明年到期,好像还是 TlsV1.0。所以急需升级(续订)。
我应该避免的是一次性为所有用户制作新的客户端证书。这对我来说会成为一场噩梦 :-)
因此,我寻找一种解决方案,使新旧证书都能正常工作,直到所有旧证书都过期。我找到了很多提示(也在 Serverfault 上),但到目前为止,没有任何方法奏效。
我目前所做的工作:我使用旧的 CA 密钥 (rootCa.key) 创建了一个新的 root.crt),并且我使用旧的服务器密钥 (server.key) 创建了一个新的 server.crt。我在 Postgres 备份服务器上安装了吊销列表 (root.crl)、root.crt、server.crt 和 server.key。
我可以连接 newUser.crt 证书,但不能连接旧证书......正如我所料。
我拼命搜索网络,找到了一个提示,可以在服务器上合并新旧证书。所以我将证书与 cat 合并:cat oldRoot.crt >> root.crt,其他文件也是如此。撤销列表不起作用,所以我注释了 Postgres.conf 中的行:#ssl_crl_file =。看来 Postgres 在没有撤销列表的情况下也可以工作。
结果:根据 server.crt 中哪个证书先出现,我可以使用旧证书或新证书进行连接,但无法同时使用两者。为了测试它,我使用了合并的 root.crt 和 oldServer.cert 以及 newServer.cert。新证书和旧证书都可以使用。
这意味着,合并的 root.crt 工作正常,但合并的 server.crt 工作异常。
我用 openssl 检查了它并合并了 root.crt 和合并的 server.crt: openssl verify -verbose -x509_strict -CAfile root.crt -CApath . old_cert.crt server.crt old_cert.crt: OK server.crt: OK
openssl verify -verbose -x509_strict -CAfile root.crt -CApath .new_cert.crt server.crt new_cert.crt:确定 server.crt:确定
看来 openssl 可以管理合并的证书,但不能管理 Postgres。
知道如何解决这个问题吗?
任何提示都值得赞赏。
问候 Schlauchi
服务器:Ubuntu 2104,Postgres13 备份服务器:Ubuntu 1604,Postgres13
答案1
我对我的问题的简短回答是:Yabadabbadooh....这是可能的,并且可以在我的备份系统上运行!
它不让我睡觉,所以我从头开始:首先,我再次检查新旧证书是否有任何差异,唯一的区别是主题的顺序不同,但内容相同。
#1 所以我用旧的 rootCa.key 和旧的 server.key 以相同的主题顺序创建了新的 root.crt 和 server.crt。现在文本输出完全相同(主题、签名算法……)
#2 我使用 root.crt 创建了一个新的 userCert。
#3 我在 Postgres 中安装了证书并进行了测试 -> 可以正常工作。
#4 这次我从顶部的新证书开始。
cat root_old.crt >> root.crt
cat server_old.crt >> server.crt
cat server_old.key >> server.key
postgres 重新启动......现在新旧证书都可以正常工作了!
#5 反过来检查,将旧证书复制到合并的证书上,然后:
cat root_new.crt >> root.crt
cat server_new.crt >> server.crt
cat server_new.key >> server.key
postgres 重新启动 ...... 它不再工作。恢复到步骤 4,一切又恢复正常。
#6 撤销列表:我为新证书创建了一个撤销列表并将其安装在 postgres 中。然后:
cat root_old.crl >> root.crl
取消注释该行:ssl_crl_file = /root.crl postgres restart ...... 并且一切正常。
我不知道为什么它现在能正常工作,我真的不敢相信这是主题顺序...猜猜我在第一次尝试时犯了其他错误。但我不会试图找出原因,它有效,就是这样 :-)
结论:
使用旧密钥制作 root.crt(CA)和 server.crt,并且尽可能相同。(检查主题等)
合并证书、撤销列表和密钥,使旧证书位于文件底部
现在,旧证书一直有效,直到过期,并且您可以使用升级的 Tls 创建新证书(使用新的 CA)。
关于 Tls 版本的一些附加信息。当我将服务器升级到 Ubuntu 2104 和 Postgres 13 时,证书不起作用。我发现在 /etc/ssl/openssl.conf 中添加此行的提示
最小协议 = TLSv1.0
我知道这没什么用,但暂时还是有帮助的。我找不到测试证书是否为 Tlsv1.0 或更高版本的方法。唯一测试其 TlsV1.2 的方法是使用 pgsql (13) 或 pgadmin4,两者都不适用于 TlsV1.0
因此,在用于创建证书的配置文件中,我使用以下命令:
最小协议 = TLSv1.2
psql (13) 和 pgadmin4 现在可以使用新证书。当所有旧证书都过期后,我会再次将 /etc/ssl/openssl.conf 更改为该值。
升级到下一个 Tls 版本已经失去了它的刺激性 :-)