gpt4 book ai didi

java - java(client-server)中如何使用wireshark检查与SSL sockets的连接等疑惑

转载 作者:太空宇宙 更新时间:2023-11-03 14:05:47 26 4
gpt4 key购买 nike

我需要使用 Java 中的 SSL 套接字开发客户端-服务器桌面应用程序。其中一项要求是对消息进行加密。

我正在尝试一些互联网示例代码,只是为了了解如何建立加密连接。这些示例似乎工作正常,或者至少它们不会产生错误,但是我必须从 Wireshark 验证消息实际上是加密的,但在 wireshark 中我只看到 TCP 数据包。在我看来,我的证书和 keystore 是正确的。

JavaSSLServer.java

/**
@web http://java-buddy.blogspot.com/
*/
public class JavaSSLServer {

static final int port = 8000;

public static void main(String[] args) {

System.setProperty("javax.net.ssl.keyStore","/home/jose/serverKey.jks");
System.setProperty("javax.net.ssl.keyStorePassword","servpass");
SSLServerSocketFactory sslServerSocketFactory =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();

try {
ServerSocket sslServerSocket =
sslServerSocketFactory.createServerSocket(port);
System.out.println("SSL ServerSocket started");
System.out.println(sslServerSocket.toString());

Socket socket = sslServerSocket.accept();
System.out.println("ServerSocket accepted");

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
try (BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(socket.getInputStream()))) {
String line;
while((line = bufferedReader.readLine()) != null){
System.out.println(line);
out.println(line);
}
}
System.out.println("Closed");

} catch (IOException ex) {
Logger.getLogger(JavaSSLServer.class.getName())
.log(Level.SEVERE, null, ex);
}
}}

JavaSSLClient.java

/**
@web http://java-buddy.blogspot.com/
*/
public class JavaSSLClient {

static final int port = 8000;

public static void main(String[] args) {
System.setProperty("javax.net.ssl.trustStore", "/home/jose/clientTrustedCerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "clientpass");
SSLSocketFactory sslSocketFactory =
(SSLSocketFactory)SSLSocketFactory.getDefault();
try {
Socket socket = sslSocketFactory.createSocket("localhost", port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
try (BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(socket.getInputStream()))) {
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("Enter something:");
String inputLine = scanner.nextLine();
if(inputLine.equals("q")){
break;
}

out.println(inputLine);
System.out.println(bufferedReader.readLine());
}
}

} catch (IOException ex) {
Logger.getLogger(JavaSSLClient.class.getName())
.log(Level.SEVERE, null, ex);
}

}

}

我添加了 System.setProperty (...

在 Wireshark 中:

image

其他示例:

https://github.com/chuidiang/chuidiang-ejemplos-google-code/commit/2843dafc0a942c2dd636f7e2e1f9be6fe0b9e9ec

Wireshark 中的结果相似。

我想与加密客户端和服务器之间的消息的 SSL 套接字建立连接,并且可以从 Wireshark 验证(这是另一个要求)。

我的问题是:

  • 如何验证消息是否真的使用 wireshark 加密?

  • 我应该看到 SSL/TLS 数据包而不是 TCP 才能断定它们已加密吗?

  • 您能告诉我一些示例代码是否错误或不完整吗?

最佳答案

您的客户端和服务器代码正在交换纯文本消息,因此,如果您在 TCP 数据包中看不到纯文本,则消息可能已被加密(根据显示的代码,它们应该是加密的)。

要验证,您可以过滤连接的两个 IP/端口对上的 Wireshark 捕获,然后将该 TCP 流解码为 TLS,然后查看是否成功。如果是这样,它将显示连接的前几个数据包(在 TCP 3 次握手之后)是未加密的 TLS 握手(交换证书并协商加密值),后续数据包是加密的 TLS 数据包。

关于java - java(client-server)中如何使用wireshark检查与SSL sockets的连接等疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751962/

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