为什么我无法在Android上成功设置SSL服务器?

时间:2014-08-11 06:32:03

标签: java android sockets ssl

我正在尝试在我的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,但没有幸福的结局。

有人可以给我一些建议吗?非常感谢。

更多信息

  1. android min版本为8,目标为19
  2. 此代码是我整个大项目中库的一部分
  3. 认证应该没问题,因为我有另一个代码来发送使用相同的SSL消息。效果很好。
  4. 任何遗失,请告诉我。再次感谢。

    =============================================== ===================

    经过艰难的一天工作,我解决了这个问题。首先问题是由我造成的。我没有完全理解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

    希望这些对于有类似问题的人有用。

0 个答案:

没有答案