带CA证书的Mongo SSL配置只适用于rails控制台,而不适用于rails服务器
问题描述:
我试图配置一个Rails 4.2.6应用程序来通过SSL连接到compose.io上的MongoDB群集。该应用程序使用mongo 2.4.1和mongoid 5.1.5宝石。 Compose.io MongoDB集群使用自签名SSL证书,因此我从compose.io下载了CA证书并将其放置在lib/certs/mongo-ca-bundle.pem
中。带CA证书的Mongo SSL配置只适用于rails控制台,而不适用于rails服务器
我mongoid.yml文件看起来像这样(节录):
development:
clients:
default:
uri: mongodb://myuser:[email protected]:1111,some-other-host.dblayer.com:2222/mydb?ssl=true
options:
ssl_ca_cert: /path/to/myapp/lib/certs/mongo-ca-bundle.pem
以上配置完美的作品,当我运行rails console
,我可以成功运行对在compose.io数据库集合查询。
然而,当我尝试运行rails server
它30秒后崩溃了“无服务器可用”错误消息:
[..]/mongo/server_selector/selectable.rb:115:in `select_server': No server is available matching preference: #<Mongo::ServerSelector::Primary:0x47167439625640 tag_sets=[] max_staleness=nil> using server_selection_timeout=30 and local_threshold=0.015 (Mongo::Error::NoServerAvailable)
[..]/mongo/cluster.rb:226:in `next_primary'
当我启用调试日志记录mongoid表示该问题与SSL握手:
DEBUG -- : MONGODB | Server some-host.dblayer.com:1111 initializing.
DEBUG -- : MONGODB | SSL handshake failed. MongoDB may not be configured with SSL support.
经常拿在轨控制台同样的错误,直到我说了ssl_ca_cert
配置。我确实设法通过指定ssl_verify: false
来连接服务器,但我不认为这是一个有效的解决方法。我怎样才能解决这个问题?控制台如何工作,但服务器不工作?
答
看来我缺少CA束中的证书导致连接失败。通过捆绑中的适当CA证书,rails server
可以很好地连接。
rails console
工作的原因似乎是它连接到本地mongodb实例,即使我在mongoid.yml
中指定了不同的URL。这似乎对我来说是越野车,但我还没有进一步调查。