通过SSL / TLS保护多平台客户端(主要是桌面和Android)与桌面服务器之间的通信

时间:2017-02-17 21:53:10

标签: java android ssl tcp udp

我浏览了JSSE参考指南+ Stack Overflow关于SSL / TLS的最常见解释,我还没有找到任何能够封装所需内容的东西。

我目前正在开展的项目是将多平台客户端( Android 桌面)连接到与机器人相连的桌面服务器上(它正在运行)在本地网络中具有并行 TCP和UDP连接 - > TCP 用于从机器人向服务器发送机器人的某种命令并且 UDP 用于更新从服务器发送到客户端的地图上的机器人位置。

也许我有点半翘起,所以我试图实现Android代码而没有真正告知自己可能出错的一切。下面的代码表示服务器端(桌面应用程序)和客户端(android应用程序)的代码。

服务器

        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystore.load(new FileInputStream(PATH_TO_KEYSTORE), PASSWORD.toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(keystore, PASSWORD.toCharArray());

        SSLContext context = SSLContext.getInstance("TLS");
        KeyManager[] keyManagers = kmf.getKeyManagers();

        context.init(keyManagers, null, null);

        SSLServerSocketFactory factory = context.getServerSocketFactory();

        serverSocket = (SSLServerSocket) factory.createServerSocket(port);
        serverSocket.setSoTimeout(0);

Android客户端:

        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystore.load(Gdx.files.internal(PATH_TO_KEYSTORE).read(), PASSWORD.toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(keystore);

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManager[] trustManagers = tmf.getTrustManagers();

        context.init(null, trustManagers, null);

        SSLSocketFactory sslSocketFactory = context.getSocketFactory();

        sslSocket = (SSLSocket) sslSocketFactory.createSocket(address, port);

变量 PATH_TO_KEYSTORE 是使用此命令keytool -genkey -keystore server.keystore生成的文件的路径。我知道我不应该为服务器和客户端提供相同的密钥库,但我不知道如何以其他方式执行此操作,这也是我的一个问题。

执行这段代码后,异常发生了错误版本的密钥库。然后我发现我完全迷失了。

无论如何,我有几个问题困扰我:

  1. 是否可以使用 SSL / TLS 确保 TCP和UDP 的通信?

  2. 是否有可能创建一个统一的方法来生成适用于每个平台的密钥库(因为我在上面的例子中发现Android不支持JKS)?

  3. 如果问题2的答案是,我如何以不同的方式保护通信(如何分别为Android和桌面版生成密钥库)?

  4. 当一切都按照应有的方式运行时(以静态方式),有没有办法动态地为客户端生成密钥库,换句话说:如何在Android代码段中生成私钥(哪个最终意味着每个客户端都有自己生成的私钥)?

0 个答案:

没有答案