Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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 如何在客户端/服务器之间创建自定义安全套接字连接?_Java_Security_Sockets_Ssl_Encryption - Fatal编程技术网

Java 如何在客户端/服务器之间创建自定义安全套接字连接?

Java 如何在客户端/服务器之间创建自定义安全套接字连接?,java,security,sockets,ssl,encryption,Java,Security,Sockets,Ssl,Encryption,我正在开发一个基于Java套接字的客户机/服务器应用程序,我想了解一些关于如何使这些应用程序安全/加密的指南。 因此,过去两周我一直在阅读有关SSL、安全性、公钥和私钥加密、对称和非对称方法的内容,我希望通过以下方法实现客户端/服务器之间的安全连接: 服务器:创建用于加密的公钥和用于解密的私钥 客户端:使用服务器的公钥加密他的凭据以及请求的时间戳,这样每次他想要进行身份验证时,加密值就不会相同。附加到此消息的客户端还包括客户端/服务器都应连接的共享密钥(对称加密) 服务器:使用他的私钥解密消息,

我正在开发一个基于Java套接字的客户机/服务器应用程序,我想了解一些关于如何使这些应用程序安全/加密的指南。 因此,过去两周我一直在阅读有关SSL、安全性、公钥和私钥加密、对称和非对称方法的内容,我希望通过以下方法实现客户端/服务器之间的安全连接:

服务器:创建用于加密的公钥和用于解密的私钥

客户端:使用服务器的公钥加密他的凭据以及请求的时间戳,这样每次他想要进行身份验证时,加密值就不会相同。附加到此消息的客户端还包括客户端/服务器都应连接的共享密钥(对称加密)

服务器:使用他的私钥解密消息,检查用户的凭据和时间戳。如果凭据正确,则它将使用对称密钥发送成功响应

其余的通信继续使用客户端的对称密钥

下面的Java代码是如何使用SSL套接字实现SSL通信的示例clientKeyStore.jks是客户端的Java密钥库,它保存服务器的公钥。我猜,当创建套接字时,客户机使用公钥来启动通信。我的问题是对称密钥的交换发生在哪里(如果发生的话?)。我是否应该考虑到任何漏洞,或者这是否可以避免中间人攻击

先谢谢你

SSLSocketServer

    public class SSLSocketServer {
       private SSLServerSocket serverSocket;

       public SSLSocketServer(int port) throws IOException {
          System.setProperty("javax.net.ssl.keyStore","serverKeyStore.jks");
          System.setProperty("javax.net.ssl.keyStorePassword", "serverKeyStorePass");

          SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
          serverSocket = (SSLServerSocket) factory.createServerSocket(port);
          start();
       }

       public void start() {
          while (true) {
             try {
                // Client is connected
                SSLSocket clientSocket = (SSLSocket) serverSocket.accept();
                System.out.println("User connected successfully?");
             } // try
             catch (IOException e) {
                e.printStackTrace();
             } // catch
          } // while
       } // run
    } // class SSLSocketServer
SSLSocketClient

    public class SSLSocketClient {
       public SSLSocketClient(String serverHost, int serverPort) throws UnknownHostException, IOException {
          System.setProperty("javax.net.ssl.trustStore","clientKeyStore.jks");
          System.setProperty("javax.net.ssl.trustStorePassword", "clientKeyStorePass");
          SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
          SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(serverHost, serverPort);
       } // SocketClient()
    } // class SSLSocketClient

对不起,我不明白你的问题。您是否在询问如何在Java中实现SSL连接的示例?如果这是一个例子,我的问题是我描述的方法是否正确,是否存在漏洞