2012-02-02 141 views
10

我的生产服务器上运行了一个应用程序,该应用程序使用pg宝石与Postgres数据库交谈。 Postgres运行在默认端口上,位于防火墙之后 - 因此它不能从任何地方访问,但是localhost。我没有配置Postgres做任何与SSL有关的事情。Rails + PostgreSQL SSL解密失败

我正在通过SSL访问Rails应用程序,并为另一个域签名了证书,所以当您第一次点击它时,会出现证书错误...但这是与SSL有关的唯一奇怪的事情。

然而,我看到间歇这我的Rails日志(伴随着一个500错误在浏览器中,当它发生):

Started GET "/admin/pages" for <xxx.xxx.xxx.xxx> at 2012-02-02 01:52:03 -0500 
Processing by PagesController#index as HTML 
Completed 500 Internal Server Error in 4ms 

ActiveRecord::StatementInvalid (PGError: SSL error: decryption failed or bad 
record mac 
: SELECT "pages".* FROM "pages"): 
    app/controllers/pages_controller.rb:36:in `index' 

什么是地狱?

回答

12

如果数据库仅在本地主机上运行,​​请关闭SSL:加密本地连接并不是很有用。在postgresql.conf中设置ssl=false(并重新启动数据库服务器),或者告诉客户端在连接时不要使用SSL。一些安装配置PostgreSQL默认使用SSL。

+0

不错,谢谢 - 这似乎已经做到了! – codykrieger 2012-02-02 18:16:09

+1

+1 - 非常感谢!这也帮助了我:-) – 2012-10-16 12:35:56

+0

对于记录:我试图通过关闭其他线程中提出的SSL重新协商来解决这个问题,但最后只关闭了SSL,正如araqnid所说的那样为我工作。 Bummer,因为我想使用数据库服务器进行远程服务:(希望有一个补丁或更新能够尽快解决这个问题。 – 2012-10-17 08:41:20

2

如果你看看你的PostgreSQL日志,你会发现同样的错误。你应该注意到,在默认情况下,安装PostgreSQL后,你将在你的postgresql.conf以下行:

ssl = true 
ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem' 
ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key' 

改变这些需要重新启动PostgreSQL的,这可能不是你的生产系统上是个好主意,因为它会破坏你的服务。

如果您希望重新加载postgresql,则可以改为使用hostnossl指令代替pg_hba.conf

由于您使用的pg宝石,你也可以强制你的应用程序,而无需连接SSL,加入这一行到您的config/database.yml

sslmode = disable 

在任何情况下,你应该调整你的PostgreSQL配置使用适当的ssl证书而不是snakeoil,如果你需要加密连接到你的数据库。