带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。这似乎对我来说是越野车,但我还没有进一步调查。