Java实现客户端与服务器的加密通信与认证的代码
时间: 2024-02-29 12:51:10 浏览: 20
以下是一个基本的Java代码示例,用于实现基于SSL的客户端与服务器的加密通信和认证。该示例中使用了自签名证书和默认的密钥库和信任库。
服务器端代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 SSLServer {
public static void main(String[] args) throws IOException {
int portNumber = 8443;
SSLServerSocketFactory sslServerSocketFactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(portNumber);
System.out.println("Server started on port " + portNumber);
while (true) {
SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
PrintWriter out = new PrintWriter(sslSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received message: " + inputLine);
out.println("Message received: " + inputLine);
}
out.close();
in.close();
sslSocket.close();
}
}
}
```
客户端代码:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class SSLClient {
public static void main(String[] args) throws IOException {
String hostname = "localhost";
int portNumber = 8443;
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(hostname, portNumber);
PrintWriter out = new PrintWriter(sslSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
String message = "Hello, server!";
out.println(message);
String response = in.readLine();
System.out.println("Received response: " + response);
out.close();
in.close();
sslSocket.close();
}
}
```
在使用此代码之前,您需要生成自签名证书并将其添加到默认的密钥库和信任库中。可以使用以下命令来生成自签名证书:
```bash
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -validity 365 -keysize 2048
```
然后,可以使用以下命令将证书导出到一个文件中:
```bash
keytool -export -alias selfsigned -keystore keystore.jks -rfc -file selfsigned.crt
```
最后,可以使用以下命令将证书导入到默认的信任库中:
```bash
keytool -import -alias selfsigned -file selfsigned.crt -keystore truststore.jks
```
在运行上述代码之前,请确保将`keystore.jks`和`truststore.jks`文件放置在正确的位置,并根据需要更改代码中的端口号和主机名。