TLS java简单实现
Java  /  管理员 发布于 5年前   513
1. SSLServer.java
package ssl;import java.io.FileInputStream;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;import java.security.KeyStore;import java.util.logging.Logger;import javax.net.ServerSocketFactory;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLServerSocket;public class SSLServer {private String SERVER_KEY_STORE = "/D:/Projects/J2EE/JDK/src/ssl/keystore/server_ks"; private String SERVER_KEY_STORE_PASSWORD = "123123"; private Logger logger = Logger.getLogger(this.getClass().getName());private SSLServerSocket createSSLServerSocket() throws Exception{// whether enable the debug mode System.setProperty("javax.net.debug", "ssl,handshake"); System.setProperty("javax.net.ssl.trustStore", SERVER_KEY_STORE); SSLContext context = SSLContext.getInstance("TLS"); KeyStore ks = KeyStore.getInstance("jceks"); ks.load(new FileInputStream(SERVER_KEY_STORE), null); KeyManagerFactory kf = KeyManagerFactory.getInstance("SunX509"); kf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray()); context.init(kf.getKeyManagers(), null, null); ServerSocketFactory factory = context.getServerSocketFactory(); ServerSocket serverSocket = factory.createServerSocket(8443); SSLServerSocket sslServerSocket = (SSLServerSocket) serverSocket; // set whether need the client authentication// sslServerSocket.setNeedClientAuth(true); return sslServerSocket;}private void start() throws Exception{SSLServerSocket sslServerSocket= createSSLServerSocket();while(true){try{Socket socket = sslServerSocket.accept();InputStream is = socket.getInputStream();byte[] bytes = new byte[Short.MAX_VALUE];int len = -1;while((len = is.read(bytes))>0){logger.info(new String(bytes,0,len));if(len<bytes.length){break;}}socket.getOutputStream().write("server balabala ... ".getBytes());socket.close();}catch(Exception e){e.printStackTrace();}}} public static void main(String[] args)throws Exception {new SSLServer().start();}}
2. SSLClient.java
package ssl;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.security.KeyStore;import java.util.logging.Logger;import javax.net.SocketFactory;import javax.net.ssl.KeyManagerFactory;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;public class SSLClient {private static String CLIENT_KEY_STORE = "/D:/Projects/J2EE/JDK/src/ssl/keystore/client_ks"; private static String CLIENT_KEY_STORE_PASSWORD = "456456"; private Logger logger = Logger.getLogger(this.getClass().getName());private Socket createNonAuthenticationSocket()throws Exception{System.setProperty("javax.net.ssl.trustStore", CLIENT_KEY_STORE); SocketFactory sf = SSLSocketFactory.getDefault(); Socket s = sf.createSocket("localhost", 8443); return s; }private Socket createAuthenticationSocket() throws Exception{System.setProperty("javax.net.ssl.trustStore", CLIENT_KEY_STORE); SSLContext context = SSLContext.getInstance("TLS"); KeyStore ks = KeyStore.getInstance("jceks"); ks.load(new FileInputStream(CLIENT_KEY_STORE), null); KeyManagerFactory kf = KeyManagerFactory.getInstance("SunX509"); kf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray()); context.init(kf.getKeyManagers(), null, null); SocketFactory factory = context.getSocketFactory(); Socket s = factory.createSocket("localhost", 8443); return s; }private void connect()throws Exception{ Socket s = createNonAuthenticationSocket(); // Socket s = createAuthenticationSocket(); PrintWriter writer = new PrintWriter(s.getOutputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream())); writer.println("hello"); writer.flush(); logger.info(reader.readLine()); s.close(); } public static void main(String[] args) throws Exception { new SSLClient().connect(); } }
PS : 解压 client_server_keystore.rar, 然后分别拷贝到指定的如下位置.
SERVER_KEY_STORE = "/D:/Projects/J2EE/JDK/src/ssl/keystore/server_ks",
CLIENT_KEY_STORE = "/D:/Projects/J2EE/JDK/src/ssl/keystore/client_ks".
然后分别运行SSLServer,SSLClient。
更过可参考如下:
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号