Play框架中基于SSL的MongoDB连接

时间:2013-02-25 12:50:50

标签: mongodb ssl playframework playframework-1.x

我在我的应用程序中使用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中用来连接db

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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;
    }
}