3

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

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

4

2 回答 2

1

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

于 2013-02-25T19:18:16.413 回答
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;
    }
}
于 2013-02-25T19:24:55.237 回答