postgresql - 将 pgAdmin3 连接到 Heroku postgreSQL DB 时出现 SSL 错误

标签 postgresql ssl heroku ssl-certificate pgadmin

当尝试使用 pgAdmin3 连接到 Heroku PostgresSQL DB 时,出现以下错误:

Error connecting to the server: SSL error: certificate verify failed

连接基于 pg:credentials 输出并定义如下:

[属性]:

  • 主持人:<主机>
  • 端口:5432
  • 服务:[空白]
  • 维护数据库:<数据库>
  • 用户名:<用户>

[SSL]:

  • SSL:需要
  • 服务器根证书文件:[空白]
  • 服务器证书吊销列表:[空白]
  • 客户端证书文件:[空白]
  • 客户端 key 文件:[空白]
  • SSL 压缩:开启

[SSH 隧道] 和[高级] 保留默认值

因此,根据 Heroku 指南,SSL 已启用(设置为:[**require**])。

有什么想法如何提供/修复错误消息引用的证书吗?

最佳答案

pgAdmin 可能会获取您系统上已配置的 CA 证书 bundle ,在这种情况下,require 将尝试根据该 bundle 验证服务器证书。

通常,这将是位于 %APPDATA%\postgresql\ 中的 root.crt 文件 (C:\Users\YourUserName\AppData\Roaming\postgresql\)(Windows 下),或 Linux 下的 ~/.postgresql/ 中。

如果有这样的文件,请尝试暂时将其移开,看看是否能更好地工作。


将其移开的问题是,您不再验证任何远程 PostgreSQL 证书,但它仍然有效(使用require,它会因verify-而失败)完整)。

您可以通过将 root.crt 文件放在正确的位置并将服务器证书添加到受信任证书列表中来解决此问题。


查找远程 PostgreSQL 证书可能有点棘手,但这个简单的 Python 应用程序应该可以让您做到这一点(根据需要替换 主机名端口):

import socket
import ssl
import struct


hostname = '...'
port = 5432

sock = socket.socket()
sock.connect((hostname, port))
# We first connect without encryption and tell the server
# we want to upgrade to SSL/TLS.
initiate_ssl_command = struct.Struct('!ii').pack(8, 80877103)
sock.sendall(initiate_ssl_command)
resp = sock.recv(1)
print "Response should be S: %s" % (resp,)

# We then initiate an SSL/TLS connection on this socket.
ssl_sock = ssl.wrap_socket(sock, cert_reqs=ssl.CERT_NONE)
ssl_sock.do_handshake()
peer_cert = ssl_sock.getpeercert(True)
print ssl.DER_cert_to_PEM_cert(peer_cert)
ssl_sock.close()

(有关此代码的详细信息,请参阅 PostgreSQL 协议(protocol)文档,特别是 "SSL Session Encryption" sectionSSLRequest message ,这与 STARTTLS 在其他协议(protocol)(例如 SMTP)中的作用类似.)

安全警告:在这里,您只是希望这个特定的连接没有受到攻击并第一次返回真正的证书。您将使用它作为后续连接的信任 anchor 。 (这与接受第一次连接的 SSH 服务器 key 非常相似,如果证书发生更改,它将标记对证书的更改。)

还值得注意的是,证书主题 DN 可能与您要连接的服务器的不匹配,因此您可能无法使用 PostgreSQL 的 verify-full 模式(这是唯一的模式)真正安全的模式,因为它还验证主机名以及信任 anchor )。

理想情况下,Heroku(或提供此服务的任何人)应通过其他安全方式为您提供该证书,并确保该证书中的主题 DN 与他们为您提供的主机名相匹配。 (我不确定目前是否是这种情况,也许可以从管理界面获得。)

关于postgresql - 将 pgAdmin3 连接到 Heroku postgreSQL DB 时出现 SSL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29185327/

相关文章:

sql - SQL 如何获取一组项目的平均值?

java - Tomcat 6 SSL 配置 - 在 Chrome 中显示重新协商已禁用的错误!

ruby-on-rails - Heroku登录时出现 ruby 错误

java - 如何在junit测试中测试sql脚本是标准sql?

ruby-on-rails - Rails 中的 ActiveRecord 查询

sql - 没有索引只扫描索引中的日期转换

ssl - Visual Studio 2013 : IIS express, ssl 禁用但需要 ssl

c# - wcf https ssl 中的服务端点出错。找不到与具有绑定(bind) WebHttpBinding 的端点的方案 http 匹配的基址

ruby-on-rails - Heroku Postgres 上自动增量 ID 的差距

php - heroku 调度程序的一些问题