rails postgres适配器支持ssl?

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

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

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

谢谢。 任何帮助或方向表示赞赏。

-H

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)

使用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 Connection页面: 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 

注意事项

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

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

但是:那里有三种不同的postgresqlgem:

  1. postgres(用C编写,已停产)
  2. pg(用C语写,维护得最好)
  3. postgres-pr(纯ruby实现,主动维护)

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的来源信息:

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

另请参阅另一个关于该主题的stackoverflow讨论: ActiveRecord可以远程连接到PostgreSQL并保护数据库密码吗?

我在查看与OP完全相同的问题之后得到了这个问题,并且对任何答案都不太满意,因为我也使用了pg gem,而且它是唯一一个支持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" 

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