`
夏文权
  • 浏览: 243886 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

Java ssl socket 双向认证

 
阅读更多
写道
总体思路步骤是
1. 分别生成客户端和服务器端密钥库
keytool -genkey -keystore E:\server.jks -keyalg rsa -alias ssl_1 -validity 700
keytool -genkey -keystore E:\client.jks -keyalg rsa -alias ssl_2 -validity 700

2将服务器和客户端的公钥导出成证书
keytool -export -alias ssl_1 -file e:\ssl_1.cer -keystore e:\server.jks
keytool -export -alias ssl_2 -file e:\ssl_2.cer -keystore e:\client.jks
3 交换证书 导入到各自的密钥库
keytool -import -file e:\ssl_1.cer -keystore e:\client.jks
keytool -import -file e:\ssl_2.cer -keystore e:\server.jks

 

public class BothwayServer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			
			SSLContext ctx = SSLContext.getInstance("SSL");
			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
			
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
			KeyStore ks = KeyStore.getInstance("JKS");
			KeyStore tks = KeyStore.getInstance("JKS");
			ks.load(new FileInputStream("e:/server.jks"),"changeit".toCharArray());
			
			tks.load(new FileInputStream("e:/server.jks"),"changeit".toCharArray());
			kmf.init(ks, "changeit".toCharArray());
			tmf.init(tks);
			ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
			SSLServerSocket serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(26666);
			serverSocket.setNeedClientAuth(true);
			Socket ssls = serverSocket.accept();
			
			
			// 以下代码同socket通讯实例中的代码
			BufferedReader socketIn = new BufferedReader(new InputStreamReader(ssls.getInputStream()));
			BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));
			
			PrintStream socketOut = new PrintStream(ssls.getOutputStream());
			String s;
			while(true){
				System.out.println("等待客户端的请求数据..");
				System.out.println("");
				s = socketIn.readLine().trim();
				if(s != null && !s.equals("")){
					System.out.println("客户端发来的消息: " + s);
					if (s.trim().equalsIgnoreCase("BYE")){
						break;
					}
				}
				
				System.out.print("服务器发出去的消息............ ");
				s = userIn.readLine();
				if(s != null && !s.equals("")){
					socketOut.println(s);
					if (s.trim().equalsIgnoreCase("BYE")){
						break;
					}
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

public class BothwayClient {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			
			SSLContext context = SSLContext.getInstance("SSL");
			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
			TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
			
			KeyStore ks = KeyStore.getInstance("JKS");  
			KeyStore tks = KeyStore.getInstance("JKS"); 

			ks.load(new FileInputStream("e:/client.jks"), "changeit".toCharArray());  
			tks.load(new FileInputStream("e:/client.jks"),"changeit".toCharArray());  
			kmf.init(ks, "changeit".toCharArray());  
			tmf.init(tks);  
			context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

			
			SSLSocket csocket= (SSLSocket) context.getSocketFactory().createSocket("localhost", 26666);
			
			System.out.println("Client OK~");
			System.out.println("===============");
			System.out.println("");

			// 以下代码同socket通讯实例中的代码
			
			BufferedReader socketIn = new BufferedReader(new InputStreamReader(csocket.getInputStream()));// 接受到的信息
			PrintStream socketOut = new PrintStream(csocket.getOutputStream());// 要发送的信息
			BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));// 用户输入信息
			String s;
			
			while (true) {
				System.out.print("客户端发出去的消息: ");
				s = userIn.readLine();
				if(s != null && !s.equals("")){
					socketOut.println(s);
					
					if (s.trim().equalsIgnoreCase("BYE")){
						break;
					}else {
						System.out.println("Please wait Server Message..");
						System.out.println("");
					}
				}
				
				s = socketIn.readLine();
				if(s != null && !s.equals("")){
					System.out.println("服务器发过来的消息: " + s);
					if (s.trim().equalsIgnoreCase("BYE")){
						break;
					}
				}
			}
			
			socketIn.close();
			socketOut.close();
			userIn.close();
			csocket.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

 

分享到:
评论

相关推荐

    Java实现SSL双向认证的方法

    Java中的SSL双向认证是一种安全通信机制,用于确保服务器和客户端之间的通信不仅加密,而且双方的身份都得到验证。这种机制在需要高安全性交互的应用场景中,如金融交易、企业内部网络通信等,尤其重要。 SSL...

    SSL Socket双向认证的实现.doc

    SSL Socket双向认证的实现 SSL 协议采用数字证书及数字签名进行双端实体认证,用非对称加密算法进行密钥协商,用对称加密算法将数据加密后进行传输以保证数据的保密性,并且通过计算数字摘要来验证数据在传输过程中...

    SSLSocket双向认证通信示例(含证书库及证书).zip

    "ssl_client"和"ssl_server"是Java源代码文件,它们包含了实现SSLSocket双向认证的逻辑。在这些代码中,客户端会加载"ejbcakclient.jks",服务器则加载"ejbcakserver.jks"。客户端在建立连接时,不仅会提供自己的...

    java https ssl 实例 例子

    Java sslSocket 聊天实例是使用 Java 的 SSL SOCKET 编程来实现安全聊天室功能的示例程序。 十二、用 COMMVIEW 工具截获浏览器访问支付宝的 TCP/IP 包 COMMVIEW 是一个网络嗅探工具,能够截获网络数据包。在本实例...

    Java中SSLSocket应用教程和代码

    使用SSLSocket,客户端和服务器可以进行双向身份验证,确保双方都是可信的。 3. **SSLSocket的工作流程** - **握手过程**:建立连接时,客户端和服务器会进行SSL握手,其中包括证书交换、加密算法协商等步骤。 - ...

    Java SSLSocket的使用

    Java SSLSocket是Java平台中用于处理安全套接字层(SSL)或传输层安全(TLS)协议的类,它是Socket类的一个子类,提供了在客户端和服务器之间进行加密通信的能力。SSL和TLS协议主要用于保护网络数据传输,防止数据被...

    JAVA实现的SSL/TLS双向认证源代码

    4. **客户端实现**:对应的`TeslaSSLClient`类则需要配置SSLSocket,同样使用自定义的`SSLContext`。客户端在建立连接时会提供自己的证书。 5. **测试**:在完成上述步骤后,你可以使用wss(WebSocket Secure)协议...

    SSL双向认证java实现

    SSL 双向认证 Java 实现 SSL 双向认证是指在客户端和服务器端之间的通信过程中,双方都需要对对方进行身份验证和授权,以确保通信的安全性。Java 语言提供了 JSSE(Java Security Socket Extension)来实现 SSL ...

    java实现-SSL双向认证1.docx

    4. **Java代码实现**:在Java中,可以使用JSSE(Java Secure Socket Extension)来配置SSL上下文并创建SSLServerSocket或SSLSocket。在服务器端,需要设置KeyManagerFactory和TrustManagerFactory,它们分别处理...

    客户端与服务器SSL双向认证(客户端:java-服务端:java)

    - 配置SSLSocket:通过SSLContext的getSocketFactory()方法创建SSLSocket,连接到服务器。 4. **握手过程**: - 客户端初始化SSL连接,发送其证书和公钥给服务器。 - 服务器验证客户端的证书,如果接受,则发送...

    java_https_ssl

    JAVA SSL SOCKET双向认证 双向认证即客户端和服务器都需要验证对方的身份,这在某些场景下是必要的,例如企业内部系统或高安全要求的B2B通信。 总结,HTTPS通过SSL/TLS协议提供了网络通信的安全保障,包括数据加密...

    activemq ssl双向认证连接

    SSL(Secure Socket Layer)是用于确保网络通信安全的一种标准协议,而双向认证(Mutual SSL/TLS Authentication)则进一步增强了这种安全性,它要求服务器验证客户端的身份,同时也要求客户端验证服务器的身份。...

    SSL 双向认证的配置总结

    SSL(Secure Socket Layer)双向认证是一种安全通信协议,它不仅要求服务器验证客户端的身份,同时也要求客户端验证服务器的身份。这种机制增强了网络通信的安全性,尤其在金融、医疗等对数据安全有高要求的领域中...

    ssl_java.zip

    在Java中实现SSL双向认证,也被称为mutual authentication,是指客户端和服务器都需要向对方证明自己的身份。以下将详细讲解这个过程及其相关的Java SSL包使用。 首先,了解SSL的工作流程。SSL握手过程通常包括以下...

    ssl双向认证密钥

    在SSL双向认证中,不仅服务器需要验证客户端的身份,客户端也需要验证服务器的身份,从而提供了更高级别的安全保护。这种模式通常在银行、企业内部网络或高度敏感的信息交换中使用。 在SSL双向认证中,涉及的主要...

    netty的SSL双向认证

    双向认证,也称为mutual SSL或Client-Auth,是SSL/TLS协议的一个特性,它要求客户端和服务器都提供身份验证,以增强安全性。 在Netty中实现SSL双向认证,我们需要以下步骤: 1. **生成证书**:首先,为服务器和...

    JAVA实现SSL协议

    在Java中,`javax.net.ssl`包提供了实现SSL通信的核心类和接口,如`SSLSocketFactory`、`SSLSocket`、`SSLServerSocketFactory`、`SSLServerSocket`以及`TrustManager`和`KeyManager`等。 1. **SSLSocketFactory和...

    基于Tomcat搭建SSL双向认证示例【100012422】

    本示例将深入探讨如何使用Tomcat搭建SSL(Secure Socket Layer)双向认证环境,以及通过Java原生类库SSLSocket进行编程,以及使用Apache的Httpclient库模拟安全的客户端请求。以下是对这些知识点的详细讲解。 首先...

    Netty双向认证以及白名单证书验证

    本篇文章将深入探讨如何利用Netty实现HTTPS的双向认证(也称为SSL/TLS的客户端身份验证)以及白名单证书验证。 首先,我们需要理解HTTPS的工作原理。HTTPS基于HTTP协议,通过SSL/TLS层提供加密传输和服务器身份验证...

Global site tag (gtag.js) - Google Analytics