首页 文章

Play框架中基于SSL的MongoDB连接

提问于
浏览
3

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

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

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

但是在MongoDB中启用SSL后,我无法通过我的播放应用程序连接到它 .

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

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

是否有可通过SSL连接的配置?

我做了一些谷歌搜索,我无法找到任何解决方案 . 请帮帮我吗?提前致谢 .

2 回答

  • 1

    我使用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;
        }
    }
    
  • 1

    Morphia模块目前不支持ssl连接 . 我不确定吗啡库是否支持它 . 请在github上创建一个问题来跟踪此要求:https://github.com/greenlaw110/play-morphia/issues?state=open

相关问题