【问题标题】:MongoDB connection over SSL in Play FrameworkPlay Framework 中通过 SSL 的 MongoDB 连接
【发布时间】:2013-02-10 14:55:43
【问题描述】:

我在我的应用程序中使用 Play 1.2.5、MongoDB 和 Morphia 模块 1.2.9。

为了创建与数据库的安全加密连接,我通过使用以下链接启用 SSL 来安装 MongoDB http://docs.mongodb.org/manual/administration/ssl/ http://www.mongodb.org/about/tutorial/build-mongodb-on-linux/

现在我可以使用 mongo --ssl 连接到 mongo shell,还可以使用 https://mylocalhost.com:27017/ 验证 MongoDB 是否正在运行

但在 MongoDB 中启用 SSL 后,我无法通过我的 play 应用程序连接到它。

以下是我在 application.conf 中用于连接数据库的行

morphia.db.host=localhost
morphia.db.port=27017
morphia.db.db=test

是否有任何配置可用于通过 SSL 连接?

我进行了一些谷歌搜索,但找不到任何解决方案。请帮我解决这个问题? 提前致谢。

【问题讨论】:

    标签: mongodb ssl playframework playframework-1.x


    【解决方案1】:

    Morphia 模块暂时不支持 ssl 连接。而且我不确定 morphia 库是否支持它。请在 github 上创建一个 issue 来跟踪这个需求:https://github.com/greenlaw110/play-morphia/issues?state=open

    【讨论】:

      【解决方案2】:

      我使用 spring-data 并遇到了同样的问题。使用 spring-data 我能够自己构造一个 Mongo 对象并将其作为构造函数参数传递。 Morphia 可能具有相同的机制。关键是:

      options.socketFactory = SSLSocketFactory.getDefault();
      

      之后,确保将 SSL 公钥安装到您的密钥库中,它应该可以工作。

      public class MongoFactory {
          public Mongo buildMongo (String replicaSet, boolean slaveOk, int writeNumber , int connectionsPerHost, boolean useSSL) throws UnknownHostException{
      
              ServerAddress addr = new ServerAddress();
              List<ServerAddress> addresses = new ArrayList<ServerAddress>();
              int port =0;
              String host = new String();
              if ( replicaSet == null )
                  throw new UnknownHostException("Please provide hostname");
              replicaSet = replicaSet.trim();
              if ( replicaSet.length() == 0 )
                  throw new UnknownHostException("Please provide hostname");
              StringTokenizer tokens = new StringTokenizer(replicaSet, ",");
              while(tokens.hasMoreTokens()){
                  String token = tokens.nextToken();
                  int idx = token.indexOf( ":" );
                  if ( idx > 0 ){               
                      port = Integer.parseInt( token.substring( idx + 1 ) );
                      host = token.substring( 0 , idx ).trim();
                  }
                  addr = new ServerAddress(host.trim(), port);
                  addresses.add(addr);
              }
      
              MongoOptions options = new MongoOptions();
              options.autoConnectRetry = true; 
              if (useSSL){
                  options.socketFactory = SSLSocketFactory.getDefault();
              }
              options.connectionsPerHost=connectionsPerHost;
              options.w=writeNumber;
              options.fsync=false;
              options.wtimeout=5000;
              options.connectTimeout=5000;
              options.autoConnectRetry=true;
              options.socketKeepAlive=true;
      
              Mongo m = new Mongo(addresses, options);
              if(slaveOk){
                  m.setReadPreference(ReadPreference.SECONDARY);
              }
              return m;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 2019-07-07
        • 2020-10-01
        相关资源
        最近更新 更多