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

时间:2015-07-11 08:20:14

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 postgresql-9.1

有没有办法让pg-gem使用sslmode = verify-full来进行postgres连接?这会像传递那个字符串一样简单吗?我有一个Rails应用程序,我想对外部数据库进行完全ca保护ssl连接,我真的不知道如何设置ca部分。在sslmode上使用require默认使用ssl流量,但我不知道在哪里(或在哪个用户下等)我应该放置我的证书来进行验证。我是否应该将它们放在〜/ .postgresql /下的普通psql客户端工作流中,以获得名为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:

1 个答案:

答案 0 :(得分:4)

Pg gem在内部使用libpq,与psql等PostgreSQL工具使用相同的客户端库。

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

来自the manual

  

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

......和......

  

可以通过设置连接参数sslrootcertsslcrl [...]

来更改根证书文件和CRL的位置

AFAIK Rails会将您放在database.yml中的任何内容传递给Pg 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

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