C#客户端与java服务器如何作SSL socket通讯

C#客户端与java服务器如何作SSL socket通讯,有没有能实现的牛人给下代码例程看看

参考GPT和自己的思路,以下是建立 C# 客户端与 Java 服务器之间的 SSL socket 通讯的详细代码示例:

Java 服务器端代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocketFactory;

public class SSLServer {
    public static void main(String[] args) throws Exception {
        int port = 8080;

        // 加载 SSL 证书
        System.setProperty("javax.net.ssl.keyStore", "server_keystore.jks");
        System.setProperty("javax.net.ssl.keyStorePassword", "password");

        // 创建 SSL socket 工厂
        SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

        // 创建服务器 socket
        ServerSocket serverSocket = sslServerSocketFactory.createServerSocket(port);

        System.out.println("服务器已启动,监听端口:" + port);

        while (true) {
            // 等待客户端连接
            Socket clientSocket = serverSocket.accept();

            System.out.println("客户端已连接:" + clientSocket.getInetAddress());

            // 创建输入输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            // 从客户端读取消息
            String message = in.readLine();

            System.out.println("接收到客户端的消息:" + message);

            // 向客户端发送响应消息
            out.println("服务器响应:" + message);

            // 关闭流和客户端 socket
            in.close();
            out.close();
            clientSocket.close();
        }
    }
}

C# 客户端代码:


using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;

public class SSLClient {
    public static void Main() {
        int port = 8080;

        // 创建 SSL 证书集合
        X509CertificateCollection certCollection = new X509CertificateCollection();
        certCollection.Add(new X509Certificate2("client_certificate.pfx", "password"));

        // 创建 SSL 流
        TcpClient client = new TcpClient("localhost", port);
        SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);

        // 客户端认证
        sslStream.AuthenticateAsClient("localhost", certCollection, SslProtocols.Tls12, false);

        Console.WriteLine("客户端已连接服务器");

        // 向服务器发送消息
        string message = "你好,服务器!";
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        sslStream.Write(messageBytes);
        sslStream.Flush();

        Console.WriteLine("已向服务器发送消息:" + message);

        // 接收服务器的响应消息
        byte[] buffer = new byte[2048];
        int bytesRead = sslStream.Read(buffer, 0, buffer.Length);
        string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);

        Console.WriteLine("接收到服务器的响应消息:" + response);

        // 关闭 SSL 流和客户端 socket
        sslStream.Close();
        client.Close();
    }

private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) {
    if (sslPolicyErrors == SslPolicyErrors.None) {
        return true;
    }

    Console.WriteLine("SSL 证书验证失败:" + sslPolicyErrors);
    return false;
}

该回答引自chatgpt
下面是一个使用C#客户端和Java服务器进行SSL Socket通信的示例代码。请注意,此示例仅适用于演示目的,实际应用中需要进行更多的错误处理和安全措施。
C#客户端代码:

using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        TcpClient client = new TcpClient("serverIpAddress", 8080);

        SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);

        try
        {
            sslStream.AuthenticateAsClient("serverName", null, SslProtocols.Tls, false);
        }
        catch (AuthenticationException e)
        {
            Console.WriteLine("Exception: {0}", e.Message);
            if (e.InnerException != null)
            {
                Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
            }
            Console.WriteLine("Authentication failed - closing the connection.");
            client.Close();
            return;
        }

        string message = "Hello from the client!";
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);

        sslStream.Write(messageBytes);
        sslStream.Flush();

        Console.WriteLine("Message sent: {0}", message);

        byte[] buffer = new byte[2048];
        int bytes;

        while ((bytes = sslStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            Console.WriteLine(Encoding.UTF8.GetString(buffer, 0, bytes));
        }

        client.Close();
    }

    private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

        // Do not allow this client to communicate with unauthenticated servers.
        return false;
    }
}

Java服务器代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyStore;
import java.security.Security;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;

public class Server {
    public static void main(String[] args) throws Exception {
        // Set up key manager to do server authentication
        char[] passphrase = "password".toCharArray();
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(Server.class.getResourceAsStream("/keystore.jks"), passphrase);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, passphrase);

        // Set up trust manager to do client authentication
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(ks);

        // Set up SSL context
        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();

        // Start server
        ServerSocket serverSocket = sslServerSocketFactory.createServerSocket(8080);

        System.out.println("Server started on port 8080");

        while (true) {
            // Accept client connections
            SSLSocket socket = (SSLSocket) serverSocket.accept();

            System.out.println("Client connected: " + socket.getInetAddress());

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

            // Receive message from client
            String message = reader.readLine();
            System.out.println("Message received: " + message);

            // Send message back to client
            writer.println("Message received: " + message);
            writer.flush();

            socket.close();
            System.out.println("Client disconnected: " + socket.getInetAddress());
        }
    }
}

请注意,此示例假设存在一个名为“keystore.jks”的密钥库文件,其中包含服务器证书和私钥。您需要根据实际情况更改密码、密钥库和证书的位置。

代码参考
https://blog.csdn.net/weixin_40397257/article/details/119140737

参考GPT和自己的思路:以下是C#客户端和Java服务器之间进行SSL Socket通讯的示例代码:

C#客户端:

using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;

public class SslTcpClient
{
    private static void DisplayUsage()
    {
        Console.WriteLine("Usage:");
        Console.WriteLine("   clientSync machineName [args]");
        Console.WriteLine("   clientSync machineName storeName");
        Console.WriteLine("   clientSync machineName storeName findType [findValue]");
        Environment.Exit(1);
    }

    public static void RunClient(string machineName, string serverName)
    {
        TcpClient client = new TcpClient(machineName, 8080);
        SslStream sslStream = new SslStream(
            client.GetStream(),
            false,
            new RemoteCertificateValidationCallback(ValidateServerCertificate),
            null
        );
        try
        {
            sslStream.AuthenticateAsClient(serverName);
            byte[] buffer = Encoding.UTF8.GetBytes("Hello, server!");
            sslStream.Write(buffer, 0, buffer.Length);
            sslStream.Flush();
            buffer = new byte[2048];
            int bytes = sslStream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("Received: {0}", Encoding.UTF8.GetString(buffer, 0, bytes));
            client.Close();
        }
        catch (AuthenticationException e)
        {
            Console.WriteLine("Exception: {0}", e.Message);
            if (e.InnerException != null)
            {
                Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
            }
            Console.WriteLine("Authentication failed - closing the connection.");
            client.Close();
            return;
        }
    }

    private static bool ValidateServerCertificate(
          object sender,
          X509Certificate certificate,
          X509Chain chain,
          SslPolicyErrors sslPolicyErrors)
    {
        if (sslPolicyErrors == SslPolicyErrors.None)
            return true;

        Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
        return false;
    }

    public static int Main(string[] args)
    {
        string serverName = "localhost";
        string machineName = Environment.MachineName;

        if (args == null || args.Length == 0)
        {
            DisplayUsage();
        }

        // User can specify the machine name and server name.
        // Server name must match the name on the server's certificate.
        machineName = args[0];

        if (args.Length < 2)
        {
            DisplayUsage();
        }

        serverName = args[1];

        RunClient(machineName, serverName);

        return 0;
    }
}


Java服务器:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;

public class SslTcpServer {
    private static final int PORT = 8080;

    public static void main(String[] args) {
        SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();

        try (SSLServerSocket serverSocket = (SSLServerSocket) ssf.createServerSocket(PORT)) {
            while (true) {
                System.out.println("Waiting for client connection...");
                SSLSocket socket = (SSLSocket) serverSocket.accept();
                System.out.println("Client connected.");

                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())), true);
String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Received message: " + inputLine);
                out.println("Server received message: " + inputLine);
            }

            in.close();
            out.close();
            socket.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}


基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)

在C#客户端和Java服务器之间进行SSL Socket通信,您需要在两边设置适当的SSL/TLS配置。以下是一个简单的示例:

Java服务器端代码:

javaCopy code
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class SSLServer {
    public static void main(String[] args) {
        int port = 12345;

        try {
            SSLServerSocketFactory sslServerSocketFactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
            System.out.println("SSL Server started on port " + port);

            SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
            System.out.println("Client connected");

            BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
            PrintWriter out = new PrintWriter(sslSocket.getOutputStream(), true);

            String line;
            while ((line = in.readLine()) != null) {
                System.out.println("Received from client: " + line);
                out.println("Server response: " + line.toUpperCase());
            }

            in.close();
            out.close();
            sslSocket.close();
            sslServerSocket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

C#客户端代码:

csharpCopy code
using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;

namespace SSLClient
{
    class Program
    {
        static void Main(string[] args)
        {
            string serverAddress = "localhost";
            int serverPort = 12345;

            try
            {
                TcpClient client = new TcpClient(serverAddress, serverPort);
                Console.WriteLine("Connected to server");

                SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
                sslStream.AuthenticateAsClient(serverAddress);

                StreamWriter writer = new StreamWriter(sslStream);
                StreamReader reader = new StreamReader(sslStream);

                string messageToSend = "Hello, Java SSL Server!";
                Console.WriteLine("Sending: " + messageToSend);
                writer.WriteLine(messageToSend);
                writer.Flush();

                string response = reader.ReadLine();
                Console.WriteLine("Received: " + response);

                client.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: " + e.Message);
            }
        }

        public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.None)
                return true;

            Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
            return false;
        }
    }
}

在运行这些示例之前,您需要确保Java服务器已配置了SSL证书(通常为.keystore文件)。在实际应用中,您需要使用可信的CA签发的证书。同时,您可能需要在C#客户端中对服务器证书进行验证。

注意:这个示例提供了一个简单的实现,用于演示如何在C#客户端和Java服务器之间使用SSL Socket通信。在实际应用中,您可能需要根据具体需求调整代码,例如处理异常、添加超时

该回答引用ChatGPT4
要在 C# 客户端和 Java 服务器之间执行 SSL 套接字通信,您需要使用 TLS/SSL 建立安全通信。在此示例中,我们将使用自签名证书进行演示。但是,在生产中,您应该使用来自受信任的证书颁发机构 (CA) 的证书。

可以分为以下几个步骤
1、先生成证书,使用 keytool(包含在 Java 中)生成自签名证书:

keytool -genkey -alias selfsigned -keyalg RSA -keysize 2048 -validity 365 -keystore keystore.jks -storetype JKS -dname "CN=localhost, OU=OrgUnit, O=YourOrg, L=City, S=State, C=Country" -storepass changeit

2、创建 Java 服务器:

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;

public class SSLServer {
    public static void main(String[] args) throws Exception {
        int port = 12345;
        String keystorePath = "keystore.jks";
        String keystorePassword = "changeit";

        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(new FileInputStream(keystorePath), keystorePassword.toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(keyStore, keystorePassword.toCharArray());

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
        SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(port);
        sslServerSocket.setNeedClientAuth(false);

        System.out.println("SSL Server is ready and waiting for a connection...");

        SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();

        BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
        PrintWriter out = new PrintWriter(sslSocket.getOutputStream(), true);

        String input;
        while ((input = in.readLine()) != null) {
            System.out.println("Received: " + input);
            out.println("Echo: " + input);
        }

        in.close();
        out.close();
        sslSocket.close();
        sslServerSocket.close();
    }
}

3、创建 C# 客户端:

using System;
using System.IO;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;

namespace SSLClient {
    class Program {
        static void Main(string[] args) {
            string serverIP = "localhost";
            int port = 12345;

            TcpClient client = new TcpClient(serverIP, port);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);

            try {
                sslStream.AuthenticateAsClient(serverIP);
            } catch (Exception e) {
                Console.WriteLine("Authentication failed - closing the connection.");
                client.Close();
                return;
            }

            StreamWriter writer = new StreamWriter(sslStream);
            StreamReader reader = new StreamReader(sslStream);

            writer.WriteLine("Hello, Java SSL Server!");
            writer.Flush();
            Console.WriteLine("Sent: Hello, Java SSL Server!");

            string response = reader.ReadLine();
            Console.WriteLine("Received: " + response);

            writer.Close();
            reader.Close();
            client.Close();
        }

        public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicy

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
要在C#客户端和Java服务器之间通过SSL socket进行通信,需要使用C#中的SslStream和Java中的SSLSocket。

以下是一个简单的代码例程:

C#客户端:

using System;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

namespace SslClient
{
    class Program
    {
        private static readonly string serverName = "example.com";
        private static readonly int serverPort = 443;
        private static readonly string certificateThumbprint = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

        static void Main(string[] args)
        {
            TcpClient client = new TcpClient(serverName, serverPort);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
            sslStream.AuthenticateAsClient(serverName);

            // 进行SSL socket通讯,发送和接收数据的代码

            sslStream.Close();
            client.Close();
        }

        private static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            // 检查服务器证书是否与指定的证书指纹匹配
            return certificate != null && certificate.GetCertHashString().Equals(certificateThumbprint, StringComparison.OrdinalIgnoreCase);
        }
    }
}

Java服务器:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.KeyStore;
import javax.net.ssl.*;

public class SslServer {
    private static final int PORT = 443;
    private static final String KEYSTORE_PATH = "path/to/keystore.jks";
    private static final String KEYSTORE_PASSWORD = "keystore_password";
    private static final String KEY_PASSWORD = "key_password";

    public static void main(String[] args) {
        try {
            KeyStore keystore = KeyStore.getInstance("JKS");
            keystore.load(SslServer.class.getResourceAsStream(KEYSTORE_PATH), KEYSTORE_PASSWORD.toCharArray());

            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(keystore, KEY_PASSWORD.toCharArray());

            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(keystore);

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

            SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();
            SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(PORT);

            SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();

            // 进行SSL socket通讯,发送和接收数据的代码

            sslSocket.close();
            sslServerSocket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项:

  1. C#客户端需要指定服务器的主机名和端口号,并验证服务器证书是否与事先指定的证书指纹匹配。
  2. Java服务器需要使用SSLServerSocketFactory创建SSLServerSocket,并指定证书、密钥等相关信息。
    如果我的回答解决了您的问题,请采纳!