Play框架中基于SSL的MongoDB连接

Play框架中基于SSL的MongoDB连接,mongodb,ssl,playframework,playframework-1.x,Mongodb,Ssl,Playframework,Playframework 1.x,我在应用程序中使用Play 1.2.5、MongoDB和Morphia模块1.2.9 为了创建到数据库的安全加密连接,我通过使用以下链接启用SSL安装了MongoDB 现在我可以使用mongo连接到mongo shell——ssl还可以验证MongoDB是否正在运行 但在MongoDB中启用SSL后,我无法通过我的play应用程序连接到它 下面是我在application.conf中用于连接数据库的行 morphia.db.host=localhost morphia.db.port=2701

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

为了创建到数据库的安全加密连接,我通过使用以下链接启用SSL安装了MongoDB

现在我可以使用mongo连接到mongo shell——ssl还可以验证MongoDB是否正在运行

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

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

morphia.db.host=localhost
morphia.db.port=27017
morphia.db.db=test
是否有任何可通过SSL连接的配置

我在谷歌上搜索了一下,没有找到任何解决办法。请帮我解决这个问题?
提前感谢。

Morphia模块目前不支持ssl连接。我不确定morphia库是否支持它。请在github上创建一个问题来跟踪此需求:

我使用spring数据,遇到了相同的问题。使用spring数据,我能够自己构造一个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;
    }
}
公共类办公室{
公共Mongo buildMongo(字符串复制集、布尔slaveOk、int WriteEnumber、int connectionsPerHost、布尔useSSL)抛出UnknownHostException{
ServerAddress addr=新的ServerAddress();
列表地址=新的ArrayList();
int端口=0;
字符串主机=新字符串();
if(replicaSet==null)
抛出新的UnknownHostException(“请提供主机名”);
replicaSet=replicaSet.trim();
如果(replicaSet.length()==0)
抛出新的UnknownHostException(“请提供主机名”);
StringTokenizer令牌=新的StringTokenizer(复制集,“,”);
while(tokens.hasMoreTokens()){
String token=tokens.nextToken();
int idx=token.indexOf(“:”);
如果(idx>0){
port=Integer.parseInt(token.substring(idx+1));
host=token.substring(0,idx.trim();
}
addr=新服务器地址(host.trim(),端口);
地址。添加(地址);
}
MongoOptions选项=新建MongoOptions();
options.autoconnectory=true;
如果(使用SSL){
options.socketFactory=SSLSocketFactory.getDefault();
}
options.connectionsPerHost=connectionsPerHost;
options.w=writeNumber;
options.fsync=false;
选项。wtimeout=5000;
选项。connectTimeout=5000;
options.autoconnectory=true;
options.socketKeepAlive=true;
Mongo m=新的Mongo(地址、选项);
如果(slaveOk){
m、 setReadPreference(ReadPreference.SECONDARY);
}
返回m;
}
}