版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/77865216
生成ssl证书请参考如下:
http://blog.csdn.net/u014410763/article/details/50555902
参考文章:
https://yq.aliyun.com/articles/40408
客户端私钥与证书导出(java需要特定格式)
openssl pkcs12 -
export
-clcerts -name foobar
-inkey
client.key
-
in
client
.crt -out
client
.keystore
服务器端私钥与证书导出
openssl pkcs12 -
export
-clcerts -name foobar
-inkey
server.key
-
in
server
.crt -out
server
.keystore
keytool -importcert -trustcacerts -
alias
foobar
-
file
ca
.crt
-keystore
ca-trust
.keystore
注意代码中的密码,可能你设置的各个证书的不同
服务器端代码
package online.geekgalaxy.test;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;
public class sslServer {
private SSLServerSocket sslServerSocket;
public static void main(String[] args) throws Exception {
sslServer server = new sslServer();
server.init();
System.out.println("SSLServer initialized.");
server.process();
}
//服务器端将要使用到server.keystore和ca-trust.keystore
private void init() throws Exception {
int port = 1234;
String keystorePath = "certs/server.keystore";
String trustKeystorePath = "certs/ca-trust.keystore";
String keystorePassword = "";
String caPassword = "111111";
SSLContext context = SSLContext.getInstance("SSL");
//客户端证书库
KeyStore keystore = KeyStore.getInstance("pkcs12");
FileInputStream keystoreFis = new FileInputStream(keystorePath);
keystore.load(keystoreFis, keystorePassword.toCharArray());
//信任证书库
KeyStore trustKeystore = KeyStore.getInstance("jks");
FileInputStream trustKeystoreFis = new FileInputStream(trustKeystorePath);
trustKeystore.load(trustKeystoreFis, caPassword.toCharArray());
//密钥库
KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(keystore, keystorePassword.toCharArray());
//信任库
TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
tmf.init(trustKeystore);
//初始化SSL上下文
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
//初始化SSLSocket
sslServerSocket = (SSLServerSocket)context.getServerSocketFactory().createServerSocket(port);
//设置这个SSLServerSocket需要授权的客户端访问
sslServerSocket.setNeedClientAuth(true);
}
private void process() throws Exception {
String bye = "Bye!";
byte[] buffer = new byte[50];
while(true) {
Socket socket = sslServerSocket.accept();
InputStream in = socket.getInputStream();
in.read(buffer);
System.out.println("Received: " + new String(buffer));
OutputStream out = socket.getOutputStream();
out.write(bye.getBytes());
out.flush();
}
}
}
客户端代码
package online.geekgalaxy.test;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;
public class sslClient {
private SSLSocket sslSocket;
public static void main(String[] args) throws Exception {
sslClient client = new sslClient();
client.init();
System.out.println("SSLClient initialized.");
client.process();
}
//客户端将要使用到client.keystore和ca-trust.keystore
private void init() throws Exception {
String host = "127.0.0.1";
int port = 1234;
String keystorePath = "certs/client.keystore";
String trustKeystorePath = "certs/ca-trust.keystore";
String keystorePassword = "";
String caPassword = "111111";
SSLContext context = SSLContext.getInstance("SSL");
//客户端证书库
KeyStore clientKeystore = KeyStore.getInstance("pkcs12");
FileInputStream keystoreFis = new FileInputStream(keystorePath);
clientKeystore.load(keystoreFis, keystorePassword.toCharArray());
//信任证书库
KeyStore trustKeystore = KeyStore.getInstance("jks");
FileInputStream trustKeystoreFis = new FileInputStream(trustKeystorePath);
trustKeystore.load(trustKeystoreFis, caPassword.toCharArray());
//密钥库
KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(clientKeystore, keystorePassword.toCharArray());
//信任库
TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
tmf.init(trustKeystore);
//初始化SSL上下文
context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
sslSocket = (SSLSocket)context.getSocketFactory().createSocket(host, port);
}
private void process() throws Exception {
//往SSLSocket中写入数据
String hello = "hello boy!";
OutputStream out = sslSocket.getOutputStream();
out.write(hello.getBytes(), 0, hello.getBytes().length);
out.flush();
//从SSLSocket中读取数据
InputStream in = sslSocket.getInputStream();
byte[] buffer = new byte[50];
in.read(buffer);
System.out.println(new String(buffer));
}
}