rails postgres适配器支持ssl?

时间:2010-01-05 20:16:26

标签: ruby-on-rails postgresql activerecord

我正在尝试配置rails应用程序以远程连接到postgres数据库。我注意到mysql的连接适配器有选项,指定设置ssl连接所需的信息,但postgres / pg适配器没有等效的选项。

谷歌搜索后,我也找不到任何东西(只通过ssh隧道连接)。

这么简单,试图让rails postgres适配器通过ssl连接到死路一条?

感谢。任何帮助或指示都表示赞赏。

-h

5 个答案:

答案 0 :(得分:3)

2012年末,情况似乎发生了变化。尽管文档仍然稀疏,但pg gem似乎会自动协商SSL,并且可以强制jdbc驱动程序使用SSL。

我的应用程序是一个混合的MRI-jRuby应用程序,它访问heroku-postgres,一个需要SSL的云postgresql服务器。

# Gemfile.lock
pg (0.14.1)

activerecord-jdbc-adapter (1.2.2.1)
activerecord-jdbcpostgresql-adapter (1.2.2.1)
jdbc-postgres (9.1.901)

pg gem似乎在自动协商SSL。但是,JDBC适配器没有。 MRI连接一个典型的database.yml(没有提到ssl),但JDBC抛出:

(FATAL: no pg_hba.conf entry for host "xx.xx.xx.xx", user "username", database "database", SSL off)

我最终尝试以JDBC-URL格式指定连接详细信息,并且连接成功:

# jruby database.yml
production:
  adapter: jdbcpostgresql
  url: jdbc:postgresql://host/database?user=user&password=password&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

(所有设置可能不需要sslfactory)

答案 1 :(得分:2)

使用JRuby

回答Rails 4

我使用Rails 4与JRuby 1.7.8(1.9.3p392)和activerecord -jdbcpostgresql-adapter 1.3.4

此解决方案将允许您的Rails应用程序使用SSL连接到PostgreSQL服务器。在这个解决方案中,我使用" NonValidatingFactory"它应该只用于测试。要安全地进行生产设置,您应该设置一个trustStore,这超出了我迄今为止的经验。

设置Postgres SSL的步骤

将gem添加到gemfile

    gem 'activerecord-jdbcpostgresql-adapter', platform: :jruby 

将参数添加到database.yml(用于开发)

    sslmode: require
    properties: { sslfactory: 'org.postgresql.ssl.NonValidatingFactory' }

对于制作,您需要创建商店并删除" NonValidatingFactor' (在connection_methods.rb中简要描述)

    # JRuby/JVM needs to be started with :
    #  -Djavax.net.ssl.trustStore=mystore -Djavax.net.ssl.trustStorePassword=...
    # or a non-validating connection might be used (for testing) :
    #  :sslfactory = 'org.postgresql.ssl.NonValidatingFactory'

参考信息

Postgres适配器是基于JDBC构建的。我发现的最有用的信息是Ruby和Java之间的接口,以及实际的JDBC文档。

适配器中的Ruby to Java接口: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql/connection_methods.rb

JDBC Postgres连接页面: http://jdbc.postgresql.org/documentation/80/connect.html

database.yml

的示例
development:

    adapter: postgresql
    encoding: unicode
    database: SSL_Test
    pool: 5
    timeout: 5000
    username: postgres
    password: YourPassword!
    sslmode: require
    properties: { sslfactory: 'org.postgresql.ssl.NonValidatingFactory' }
    host: www.example.com
    port: 5432

注意事项

这可能适用于其他配置和版本。如果您确实成功了,请继续为其他人添加评论,以了解这在您的特定配置中有效。感谢。

答案 2 :(得分:1)

阅读PostgreSQLAdapter的rubyonrails api我只想回答你的问题 http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html

但是:那里有三种不同的postgresql宝石:

  1. postgres(用C编写,已停止使用)
  2. pg(用C语言写成,维护得最好)
  3. postgres-pr(纯ruby实现,主动维护)
  4. gem“pg”似乎允许SSL连接(至少在查看源代码时)。这似乎无处可记录,但看起来它有效(redmine在此证实:http://www.redmine.org/wiki/1/RedmineInstall)。

    所以我建议您可以查看如何使用MYSQL配置database.yml,并尝试使用pg gem。还要确保您使用SSL支持编译postgresql。 见http://www.williambharding.com/blog/rails/guide-to-setup-rails-with-mysql-ssl/

    如果这一切都不起作用,也许你可以尝试从rails修补数据库连接并将connection_parameters添加到ssl连接。这是源自ruby-pg的信息:

    <var>sslmode=mode</var> : how to treat SSL(string) (one of disable, allow, prefer, require)
    

    另请参阅有关该主题的另一个stackoverflow讨论: Can ActiveRecord connect to PostgreSQL remotely and protect the DB password?

答案 3 :(得分:1)

我在查看与OP完全相同的问题之后来到这里,并且对任何答案都不满意,因为我也使用了pg gem而且它是唯一受支持的for Rails 2.X.

经过我的同事的一些调查,他意识到以下情况:

在Rails 4中,您可以指定一个变量哈希来执行此操作(http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html)但它不存在于Rails 2中(http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html

因此我们可以简单地删除典型的配置并将所有内容抛入数据库参数并将其调用一天(很像使用jdbc适配器发布的原始答案whitehat101)

以下是用于连接远程服务器并使用所需sslmode的实现。

development:
    adapter: postgresql
    database: "host=db-serv dbname=admin_production user=XX password=XX sslmode=verify-ca"

答案 4 :(得分:0)

Rails&lt; 3.2实际上不会将database.yml ssl配置传递给PG gem。我希望我的痛苦可以节省你几个小时的调试时间。