有没有办法让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:
答案 0 :(得分:4)
Pg
gem在内部使用libpq
,与psql
等PostgreSQL工具使用相同的客户端库。
默认情况下,libpq
会在~/.postgresql/
中查找CA证书。
来自the manual:
要允许服务器证书验证,必须将一个或多个受信任CA的证书放在用户主目录中的文件
~/.postgresql/root.crt
中。 (在Microsoft Windows上,该文件名为%APPDATA%\postgresql\root.crt
。)
......和......
可以通过设置连接参数
来更改根证书文件和CRL的位置sslrootcert
和sslcrl
[...]
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客户端证书存在类似问题,您无法提供密钥库和证书存储,您必须传递给定主机的特定文件。听起来你可能已经知道了上游证书签名权限。