当前位置: 首页 > 知识库问答 >
问题:

从Java客户端建立到的SSL连接时出错。网络服务器

赵永新
2023-03-14

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

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

>

makecert-r-pe-sr“localhost”-$individual-n“CN=localhost”-sv。pvk-r本地主机。cer

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

出口。cer文件作为一个。pem(Base64格式)。

拿了这个。cer文件(上述证书的公共组件)并创建了一个。jks文件(JavaKeyStore)使用以下命令作为java客户机使用。

keytool \-import \-v \-trustcacerts \-alias 0 \-file

装了这个。jks在Java客户端应用程序中启动,并使用以下代码启动连接

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);

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

系统。组件模型。Win32异常:客户端和服务器无法通信,因为它们不拥有共同的算法

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

X509Certificate cert=新的X509Certificate(“localhost.pfx”、“abc123”);

TcpListener listener=new TcpListener(IPAddress.Loopback,443);听众。开始();

虽然(真的){

尝试{tcpClient tcpClient=listener. AcceptTcpClient();

  NetworkStream networkStream = tcpClient.GetStream();

  SslStream sslStream = new SslStream(networkStream);

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

假);

  byte[] data1 = new byte[4];

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

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

  String message = "Length of incoming data " +

比特转换器。ToInt32(数据1,0);

  byte[] data2 = new byte[len];

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

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

  Thread.Sleep(1000);     

}捕获(例外情况除外)
{
}

异常发生在该行

sslStream。AuthenticateTaserver(cert,false,SslProtocols.Default,false);

这可能是什么原因?我该如何修复它?

任何帮助都将不胜感激。

共有1个答案

鲜于岳
2023-03-14

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

 类似资料:
  • 我在通过TCP连接到Spring Boot RSocket应用程序时遇到问题。使用RSocketRequest ester时的客户端工作正常,但当我尝试使用RSocketFactory客户端连接时,它总是出错。下面的代码。 这会产生以下错误: 据我所知,这个特殊的错误是由于netty消息包装(来自stackoverflow上的其他线程)造成的,但如何解决呢?服务器是Spring Boot 5 RS

  • 我正在尝试调用一个出站的外部网络服务,即https。它在我当地的MuleStudion环境中工作正常。但是当我部署进行测试时。我收到异常 异常堆栈为: 信任Anchors参数必须为非空(java.security.Invalid算法参数异常)java.security.cert.PKIXP参数:200(null) 意外错误:java.security.Invalid算法参数异常:信任锚参数必须为非

  • 我正在尝试在Java创建一个多客户机/服务器应用程序。我有些问题因为我的线好像纠缠在一起了...这就是我要做的。 > 我有一个服务器类,它通过使用以下代码来接受客户端: while(true){Socket Socket=ServerSocket.Accept();} 我的服务器应该记住所连接的客户端,因此我使用该套接字创建一个名为ClientThread的新线程,并将该线程放在服务器上的列表中

  • 下面是我的服务器代码: 下面是我的客户端活动代码: 以下是客户端活动的xml布局文件: 因此,我开始认为这不是连接端口的问题,而是应用程序的android客户端的问题。但我想不出有什么问题。 顺便说一下,当我试图发送消息时,运行客户端的手机和运行服务器的笔记本电脑都连接到了同一个网络。

  • 我正在尝试使用hazelcast v3。2.4(服务器和客户端上的版本相同)。服务器(我可以安装的简单实现)正在服务器上运行。客户端尝试连接到远程服务器-服务器打印身份验证请求,但我收到以下日志输出(包括异常)-关于我可以做什么不同的想法(复制日志输出和配置文件)。我正在尝试通过TCP/IP进行连接,我检查了网络连接——我没有看到任何东西阻止连接。 堆栈中提到的代码行: 配置 日志输出 服务器输出

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接