gpt4 book ai didi

java - 从 Java 客户端到 .NET 服务器建立 SSL 连接时出错

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:35 25 4
gpt4 key购买 nike

我正在学习 SSL,在此过程中,我试图在 .NET 服务器与 Java 客户端之间创建 SSL 连接。为此,我使用自签名证书。我不想在 Java 中使用标准 keystore ,因此我创建了一个自定义 keystore 并改为加载它。

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

  1. 在 Windows 上使用以下命令生成证书。

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

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

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

  4. 使用以下命令获取 .cer 文件(上述证书的公共(public)组件)并创建一个 .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);

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

System.ComponentModel.Win32Exception: The client and server cannot communicate, because they do not possess a common algorithm

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

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,

false);

  byte[] data1 = new byte[4];

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

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

String message = "Length of incoming data " +

BitConverter.ToInt32(data1, 0);

  byte[] data2 = new byte[len];

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

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

Thread.Sleep(1000);

} catch (Exception ex)
{
} }

异常发生在行

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

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

如有任何帮助,我们将不胜感激。

最佳答案

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

关于java - 从 Java 客户端到 .NET 服务器建立 SSL 连接时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12581087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com