我正在尝试在我的Android项目中设置一个SSL服务器套接字。我在stackoverflow中引用了很多会话,最后我初始化了我的服务器套接字,如下面的代码
String type = KeyStore.getDefaultType();
KeyStore store=KeyStore.getInstance(type);
inputStream=this.getClass().getResourceAsStream("test.bks");
store.load(inputStream, password);
inputStream.close();
String keyalg=KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory factory=KeyManagerFactory.getInstance(keyalg);
factory.init(store,password);
KeyManager []keyManagers=factory.getKeyManagers();
context=SSLContext.getInstance("SSL");
context.init(keyManagers, null, null);
ServerSocketFactory factory= context.getServerSocketFactory();
serverSocket=(SSLServerSocket)factory.createServerSocket(12345);
while (true) {
Socket socket = serverSocket.accept();
new ReceiveSocket(socket).start();
}
当代码步入serverSocket.accept()
时,会引发一个例外:
javax.net.ssl.SSLException: Could not find any key store entries to support
the enabled cipher suites
我尝试逐步调试,我发现keyManagers
似乎是关键问题。名为Keymanagers
的{{1}}中的一个字段为空,而具有一个地址的类似纯Java代码EntrySet
为空。 BTW纯Java代码工作正常。我尝试以不同的方式配置EntrySet
,但没有幸福的结局。
有人可以给我一些建议吗?非常感谢。
更多信息
任何遗失,请告诉我。再次感谢。
=============================================== ===================
经过艰难的一天工作,我解决了这个问题。首先问题是由我造成的。我没有完全理解SSL协议,特别是对于ceritification文件的使用。我使用BKS文件是客户端的公共ceritification文件,而不是服务器的私有文件。这就是服务器无法设置的原因。请参阅Yaragalla的博客http://yaragalla.blogspot.jp/2013/05/how-to-create-ssl-serversocket-on.html。我为我的Android服务器端获得了BKS格式的私有ceritification。然后我使用follwing命令为我的Android clinet端获取我的BKS公共文本化文件。
keytool -exportcert -file ServerKey.cert -keystore。\ ServerKeystore -storetype BKS keytool -importcert -keystore clientkey.bks -file ServerKey.cert -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
希望这些对于有类似问题的人有用。