Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过SSL/TLS保护多平台客户端(主要是桌面和Android)与桌面服务器之间的通信_Java_Android_Ssl_Tcp_Udp - Fatal编程技术网

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

Java 通过SSL/TLS保护多平台客户端(主要是桌面和Android)与桌面服务器之间的通信,java,android,ssl,tcp,udp,Java,Android,Ssl,Tcp,Udp,我阅读了JSSE参考指南+堆栈溢出最常见的关于SSL/TLS的解释,但还没有找到任何能够封装我所需要的一切的东西 我目前正在做的项目是将多平台客户端(Android或Desktop)连接到与机器人相连的桌面服务器上(它在具有并行TCP和UDP连接的本地网络中工作->TCP用于将机器人的某种命令从客户端发送到服务器,UDP用于更新从服务器发送到客户端的地图上的机器人位置) 也许我有点不理智,所以我尝试实现Android代码,但没有真正告知自己可能出现的所有错误。下面的代码代表服务器端(桌面应用程序

我阅读了JSSE参考指南+堆栈溢出最常见的关于SSL/TLS的解释,但还没有找到任何能够封装我所需要的一切的东西

我目前正在做的项目是将多平台客户端(AndroidDesktop)连接到与机器人相连的桌面服务器上(它在具有并行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);
        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);
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);
        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
。我知道服务器和客户端不应该有相同的密钥库,但我不知道如何用其他方法来实现,这也是我的问题之一

在执行这段代码之后,出现了一个异常,它说密钥存储的版本错误。,然后我发现我完全迷路了

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

  • 是否可以使用SSL/TLS保护TCP和UDP的通信安全

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

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

  • 当一切都像它应该的那样(以静态方式)运行时,有没有一种方法可以动态地为客户端生成密钥库,换句话说:如何在Android代码段中生成他的私钥(这最终意味着每个客户端都有自己生成的私钥)