我在我的应用程序中使用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连接的配置?
我做了一些谷歌搜索,我无法找到任何解决方案。请帮帮我吗? 提前谢谢。
答案 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;
}
}