Rails + PostgreSQL SSL解密失败

时间:2012-02-02 07:38:53

标签: sql ruby-on-rails ruby postgresql

我的生产服务器上运行的应用程序使用pg gem与Postgres数据库通信。 Postgres在默认端口上运行,并且位于防火墙后面 - 因此除localhost之外的任何内容都无法访问它。我没有将Postgres配置为执行任何与SSL相关的操作。

我正在通过SSL访问Rails应用程序,并且证书已经签署了另一个域,因此第一次点击它时会出现证书错误......但这是SSL相关的唯一奇怪的事情。< / p>

然而,我在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'

到底是什么?

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分: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,则可以改为pg_hba.conf:使用hostnossl指令。

由于您使用的是pg gem,您还可以强制您的应用在没有ssl的情况下进行连接,方法是将此行添加到config/database.yml

sslmode = disable

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