从Java客户端到.NET服务器进行SSL连接时出错

Hes*_*era 6 .net java ssl self-signed x509certificate

我正在学习SSL,在这个过程中,我试图在.NET服务器和Java客户端之间创建SSL连接.我为此目的使用自签名证书.我不想在Java中使用标准密钥库,因此我创建了一个自定义密钥库并将其加载.

我使用以下步骤生成证书和要在.NET服务器端使用的pfx文件.

  1. 在Windows上使用以下命令生成cerficiate.

    makecert -r -pe -sr"localhost" - $ individual -n"CN = localhost"-sv .pvk -r localhost.cer

  2. 将其转换为.pfx,以便我可以在.NET服务器应用程序上加载此证书.

  3. 将.cer文件导出为.pem(Base64格式).

  4. 获取.cer文件(上述证书的公共组件)并使用以下命令创建一个.jks文件(JavaKeyStore)以用作Java客户端.

    keytool\-import\-v\-trustcacerts\-alias 0\-file <(openssl x509 -in localhost.pem)\ -keystore mystore.jks\-storetype JKS\-storepass ez24get

  5. 在Java客户端应用程序中加载此.jks并使用以下代码启动连接

    FileInputStream fis = new FileInputStream("res/myjksstore.jks");
    KeyStore trusted = KeyStore.getInstance("JKS");
    trusted.load(fis, "ez24get".toCharArray());           
    
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(trusted);
    
    SSLContext context = SSLContext.getInstance("SSL");
    context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
    
    Socket socket = context.getSocketFactory().createSocket("localhost", 443);
    
    String str = "abc123";
    
    socket.getOutputStream().write(GeneralUtil.toByta(str.length()));
    socket.getOutputStream().write(str.getBytes());
    
    socket.setKeepAlive(true);
    
    Run Code Online (Sandbox Code Playgroud)

但是当我尝试将数据写入套接字时,我在服务器端收到以下错误

System.ComponentModel.Win32Exception:客户端和服务器无法通信,因为它们没有通用的算法

我的服务器代码如下所示......

X509Certificate cert = new X509Certificate("localhost.pfx","abc123");

TcpListener listener = new TcpListener(IPAddress.Loopback,443); listener.Start();

while(true){

try {TcpClient tcpClient = listener.AcceptTcpClient();

  NetworkStream networkStream = tcpClient.GetStream();

  SslStream sslStream = new SslStream(networkStream);

  sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default,
Run Code Online (Sandbox Code Playgroud)

假);

  byte[] data1 = new byte[4];

  sslStream.Read(data1, 0, data1.Length);

  int len = BitConverter.ToInt32(data1, 0);

  String message = "Length of incoming data " +
Run Code Online (Sandbox Code Playgroud)

BitConverter.ToInt32(data1,0);

  byte[] data2 = new byte[len];

  sslStream.Read(data2, 0, data2.Length);

  message += "   Message: " + ASCIIEncoding.ASCII.GetString(data2);

  Thread.Sleep(1000);     
Run Code Online (Sandbox Code Playgroud)

} catch(Exception ex)
{
}}

该行发生异常

sslStream.AuthenticateAsServer(cert,false,SslProtocols.Default,false);

可能是什么原因,我该如何解决?

任何帮助将受到高度赞赏.

Ale*_*lex -1

SSLEngine(从SSLContext获取)必须设置为客户端模式(setUseClientMode)