pg gem sslmode=verify-full,在哪里放置证书?

non*_*ame 3 ruby postgresql ruby-on-rails postgresql-9.1 ruby-on-rails-4

pg-gem 有没有办法将 sslmode = verify-full 用于它的 postgres 连接?这会像只传递那个字符串一样简单吗?我有一个 Rails 应用程序,我想对外部数据库进行完整的 ca 保护的 ssl 连接,但我真的不知道如何设置其中的 ca 部分。在 sslmode 上使用 require 会默认使用 ssl 流量,但我不知道我应该在哪里(或在哪个用户下等)放置我的证书以进行验证。我是否应该像正常的 psql 客户端工作流程一样将它们放在 ~/.postgresql/ 下,以获取名称为 root.crt、postgresql.cert 和 postgresql.key 的已验证 ssl 证书?

如果有帮助的话,我正在使用 Postgres 9.1。

为以后来的人编辑:

以下 database.yml 文件似乎可以在我的开发机器上进行测试。我肯定会写一篇关于这个问题的博客文章,因为这是一个 PITA 找出出了什么问题。

  host: 127.0.0.1
  sslcert: <%= Rails.root.join('config', 'client.crt') %>
  sslkey: <%= Rails.root.join('config', 'client.key') %>
  sslrootcert: <%= Rails.root.join('config', 'root.crt') %>
  sslmode: verify-full
  database: pg-test_development
  username: postgres
  password:
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 8

Pg宝石使用libpq内部,同一个客户端库作为PostgreSQL的工具,如psql

默认情况下libpq查找~/.postgresql/CA 证书。

手册

要允许服务器证书验证,必须将一个或多个受信任 CA 的证书放在~/.postgresql/root.crt用户主目录的文件中。(在 Microsoft Windows 上,该文件名为%APPDATA%\postgresql\root.crt。)

... 和 ...

根证书文件和 CRL 的位置可以通过设置连接参数sslrootcertsslcrl[...]

AFAIK Rails 将您放入的任何内容传递database.ymlPggem,gem 将其libpq作为连接参数传递给。因此,您应该能够将键/值条目添加到您的database.yml节中,例如:

sslmode: verify-full
# and if you don't want to use ~/.postgresq/root.crt for the cert location, set:
sslrootcert: /path/to/my/app/root/cert.crt
Run Code Online (Sandbox Code Playgroud)

IMO 要求将单个根证书传递给libpq是一个设计缺陷。它应该加载受信任的证书数据库。使用 SSL 客户端证书存在类似问题,您无法提供密钥库和证书库,您必须为给定主机传递特定文件。听起来这对您来说可能没问题,因为您知道上游证书签名机构。