我的生产服务器上运行的应用程序使用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'
到底是什么?
答案 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。