`

TLS java简单实现

    博客分类:
  • jdk
阅读更多

 

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。

 

更过可参考如下:

Https(SSL/TLS)原理详解

SSL介绍与Java实例


 

分享到:
评论

相关推荐

    Java Socket 实现SMTP邮件发送,支持SSL/TSL

    在本案例中,我们将关注如何使用Java Socket来实现SMTP(Simple Mail Transfer Protocol)邮件发送,并支持SSL(Secure Sockets Layer)和TLS(Transport Layer Security)安全协议。 SMTP是一种互联网标准,用于在...

    基于 MINA 的 TLS/SSL NIO Socket 实现(二)

    本文将主要关注在Java中使用MINA来实现安全套接层(SSL)和传输层安全(TLS)协议,这两个协议是网络安全通信的基础,确保数据在网络中的加密传输。 首先,理解TLS/SSL的核心概念至关重要。它们都是为网络通信提供...

    vnc的java实现源码

    6. **安全性**:虽然原始的VNC协议本身不提供强大的安全特性,但实现可能包含加密和身份验证机制,如使用SSL/TLS进行数据加密,或者集成第三方认证服务,例如使用Java的`javax.security.auth`包。 7. **用户界面**...

    Java实现SSL双向认证的方法

    实现Java SSL双向认证通常涉及以下几个步骤: 1. **生成密钥库(KeyStore)**: - 服务器端需要一个KeyStore,存储其私钥,通常使用`keytool`命令生成,例如:`keytool -genkey -alias serverkey -keystore ...

    java简单实现远程协助

    本篇文章将深入探讨如何使用Java技术来简单实现远程协助功能。 首先,我们要理解Java远程方法调用(Java RMI,Remote Method Invocation)是实现远程协助的基础。RMI允许一个Java对象调用另一个在不同JVM(Java ...

    Java实现远程控制技术(附完整源代码)

    Java提供SSL/TLS加密机制,可以通过Socket编程实现安全的网络连接。此外,还可以通过认证和授权机制,如用户名密码登录或者数字证书,来防止未经授权的访问。 6. **性能优化**:为了减少延迟和提高用户体验,可以...

    JAVA实现简单的对FTP上传与下载

    本文将详细介绍如何使用Java实现简单的FTP文件上传与下载功能,并基于提供的"ftpLoadDown.jar"库和"使用方法.txt"来解析相关知识。 首先,我们需要了解FTP的基础知识。FTP是一种应用层协议,它依赖于TCP/IP协议栈,...

    java写的简易QQ聊天

    在这个简易QQ聊天工具中,开发者可能使用了Java的基础语法,如类、对象、接口、异常处理、输入输出流等,来实现程序的基本结构和功能。 2. **Swing或JavaFX图形用户界面**:Java提供了Swing和JavaFX库用于构建桌面...

    基于Java实现的GB28181平台.zip

    7. **安全机制**:GB28181对数据传输的安全性有较高要求,Java的SSL/TLS支持可实现加密通信,同时可能还需要实现身份认证和授权机制。 8. **设备适配器**:由于兼容不同厂商的设备,可能需要编写设备适配器层,以...

    Java语言实现简单FTP软件源代码+FTPClientForJava

    Java语言实现简单FTP软件源代码+FTPClientForJava是一个针对初学者和中级开发者的学习资源,它涵盖了使用Java编程语言开发FTP(文件传输协议)客户端的基本概念和技术。FTP是一种用于在Internet上传输文件的标准协议...

    grpc-java,Java GRPC实现。基于http/2的rpc.zip

    这个压缩包“grpc-java,Java GRPC实现。基于http/2的rpc.zip”包含的是GRPC的Java实现,名为“grpc-java-master”,表明这是一个GRPC的Java版本源码仓库的主分支。 1. **GRPC基础概念**: - **RPC (Remote ...

    Java 下 简单 实现 tr069 协议

    在Java平台上实现TR069,可以利用其跨平台的优势,实现对不同操作系统和硬件环境的支持。 首先,我们来看"JAVA平台下对TR069协议的实现.doc"这份文档。这很可能是一个详细的技术报告,阐述了如何在Java环境下开发一...

    Java Socket实现简单点对点聊天软件

    Java Socket实现的简单点对点聊天软件是一种基于网络通信的C/S(客户端/服务器)架构的应用。在这个系统中,服务器端作为一个中央节点,接收并转发客户端之间的消息,而客户端则负责用户交互,发送和接收聊天内容。...

    QQ源码Java实现

    阅读这些文章能帮助你理解如何在Java中实现一个简单的即时通讯系统,涉及的不仅是基本的网络编程,还有错误处理、异常捕获、日志记录等多个实用技巧。 总的来说,QQ源码Java实现是一个很好的学习资源,它将理论知识...

    java实现一个邮件客户端

    1. **JavaMail API**: JavaMail API是Java平台的核心组件之一,提供了处理SMTP(简单邮件传输协议)、POP3(邮局协议)和IMAP(因特网消息访问协议)的接口和类。它允许开发者创建、读取、发送和管理电子邮件。 2. ...

    java实现邮件发送(三种发送方式都有)

    `普通邮件发送演示.java`应该展示了如何使用JavaMail API发送简单的文本邮件。JavaMail API是Java中用于处理电子邮件的标准库,包括了发送邮件、接收邮件等功能。要发送普通邮件,你需要设置SMTP服务器地址、端口、...

    Java简易聊天程序

    Java简易聊天程序是一种基于Java编程语言实现的交互式通信应用,它允许用户通过网络进行文本聊天。这个程序的核心概念和关键技术主要包括多线程、网络编程、输入/输出流以及简单的用户界面设计。以下是对这些关键...

    java实现的简单网络聊天软件

    本项目以"java实现的简单网络聊天软件"为主题,利用Java这一强大的编程语言构建了一个基础的网络聊天平台。以下是对该软件及其核心知识点的详细说明。 首先,Java是一种面向对象的编程语言,具有跨平台性、稳定性和...

    java实现ftp上传jar包

    2. **Java FTP库**:在描述中提到了`edtftpj.jar`,这是一个Java FTP客户端库,提供了一种简单的方式来处理FTP连接和文件传输。另外,`commons-net-1.4.1.jar`是Apache Commons Net库的一部分,也提供了FTP客户端的...

Global site tag (gtag.js) - Google Analytics