`
sariel
  • 浏览: 53209 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
功能:1) 客户端首先必须以普通连接方式连接连接服务器
     2) 服务器接收到连接后,通知客户端启用TLS/SSL方式连接
     3) 双方都启用成功后,通过数据加密方式完成信息的通信
备注: TLS/SSL 实现是基于 MINA 的官方例子
地址: http://mina.apache.org/


客户端和服务器端通信内容:
客户端:HELLO
服务器:Hello SSL
客户端:Client SSL Finished
服务器:Server SSL Finished
客户端:信息安全吗?
服务器:信息安全!
客户端:lawless command(非法的命令)
服务器:No Support Command(服务器响应不支持此命令)

服务器端代码:
package com.sariel.tls.server;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class TempTLSServer {
	private static final int PORT = 50003;

	public static void main(String[] args) throws Exception {
		/** 创建服务器端连接器 **/
		SocketAcceptor acceptor = new NioSocketAcceptor();
		acceptor.setReuseAddress(true);
		/** 获取默认过滤器 **/
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		/** 设置编码过滤器和按行读取数据模式 **/
		chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		/** 设置事件处理器 **/
		acceptor.setHandler(new TempTLSServerHandler());
		/** 服务绑定到此端口号 **/
		acceptor.bind(new InetSocketAddress(PORT));
		System.out.println("服务器在 [" + PORT + "] 等待连接...");
	}
}

package com.sariel.tls.server;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.mina.filter.ssl.SslFilter.SslFilterMessage;

import com.sariel.tls.BogusSslContextFactory;

public class TempTLSServerHandler extends IoHandlerAdapter {
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("[NIO Server]>> sessionCreated");
		/** 启用加密过滤通知 **/
		session.setAttribute(SslFilter.USE_NOTIFICATION);
	}

	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("[NIO Server]>> sessionOpened");
	}

	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("[NIO Server]>> sessionClosed");
	}

	public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		System.out.println("[NIO Server]>> sessionIdle");
	}

	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.out.println("[NIO Server]>> exceptionCaught :");
		cause.printStackTrace();
	}

	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Server]>> messageReceived");
		String msg = "";
		if (message instanceof SslFilterMessage) {
			msg = ((SslFilterMessage) message).toString();
		} else {
			msg = (String) message;
		}
		System.out.println("[NIO Server Received]>> : " + msg);
		if ("Hello".equalsIgnoreCase(msg)) {
			session.write("Hello SSL");
		} else if ("Client SSL Finished".equalsIgnoreCase(msg)) {
			session.getFilterChain().addFirst("SSL", new SslFilter(BogusSslContextFactory.getInstance(true)));
			// ((SslFilter)session.getFilterChain().get("SSL")).startSsl(session);
			session.write("Server SSL Finished");
		} else if ("信息安全吗?".equals(msg)) {
			session.write("信息安全!");
		} else {
			session.write("No Support Command");
		}
	}

	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Server]>> messageSent");
		System.out.println("[NIO Server messageSent]>> : " + (String) message);
	}

}

客户端代码:
package com.sariel.tls.client;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.security.GeneralSecurityException;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class TempTLSClient {

	private static final int PORT = 50003;

	private static final String TARGET_IP = "192.168.12.41";

	public static void main(String[] args) throws GeneralSecurityException {
		/** 创建客户端连接器 **/
		IoConnector connector = new NioSocketConnector();
		/** 设置事件处理器 **/
		connector.setHandler(new TempTLSClientHandler());
		/** 设置编码过滤器和按行读取数据模式 **/
		connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		/** 创建连接 **/
		ConnectFuture future = connector.connect(new InetSocketAddress(TARGET_IP, PORT));
		/** 等待连接创建完成 **/
		future.awaitUninterruptibly();
		/** 获取连接会话 **/
		IoSession session = future.getSession();
		/** 发送信息 **/
		session.write("HELLO");
		/** 等待连接断开 **/
		session.getCloseFuture().awaitUninterruptibly();
		connector.dispose();
	}
}

package com.sariel.tls.client;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.ssl.SslFilter;

import com.sariel.tls.BogusSslContextFactory;

public class TempTLSClientHandler extends IoHandlerAdapter {
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("[NIO Client]>> sessionCreated");
	}

	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("[NIO Client]>> sessionOpened");
	}

	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("[NIO Client]>> sessionClosed");
	}

	public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		System.out.println("[NIO Client]>> sessionIdle");
	}

	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.out.println("[NIO Client]>> exceptionCaught :");
		cause.printStackTrace();
	}

	public void messageReceived(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Client]>> messageReceived");
		System.out.println("[NIO Client Received]>>" + (String) message);
		if ("Hello SSL".equals((String) message)) {
			session.write("Client SSL Finished");
		} else if ("Server SSL Finished".equals((String) message)) {
			session.write("信息安全吗?");
		} else if ("信息安全!".equals((String) message)) {
			session.write("lawless command");
		}
	}

	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("[NIO Client]>> messageSent");
		System.out.println("[NIO Client messageSent]>> : " + (String) message);
		if ("Client SSL Finished".equals((String) message)) {
			SslFilter connectorTLSFilter = new SslFilter(BogusSslContextFactory.getInstance(false));
			connectorTLSFilter.setUseClientMode(true);
			session.getFilterChain().addFirst("SSL", connectorTLSFilter);
			// ((SslFilter)session.getFilterChain().get("SSL")).startSsl(session);
		}
	}
}

创建 KEY 文件指令:keytool -genkey -alias bogus -keysize 512 -validity 3650 -keyalg RSA -dname "CN=bogus.com, OU=XXX CA,O=Bogus Inc, L=Stockholm, S=Stockholm, C=SE" -keypass boguspw -storepass boguspw -keystore bogus.cert
(在 Java 源文件 BogusSslContextFactory.java 中也有,是官方的)
分享到:
评论

相关推荐

    Mina NIO Socket

    在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket的核心概念、工作原理以及在实际项目中...

    Mina+Socket通信

    import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { public static void main(String[] args) throws Exception { IoAcceptor acceptor = new NioSocketAcceptor(); ...

    网络编程(socket、NIO、mina)---demo

    在这个"网络编程(socket、NIO、mina)---demo"的主题中,我们将深入探讨三个关键概念:Socket编程、非阻塞I/O(Non-blocking I/O,简称NIO)以及Apache Mina框架。这些技术广泛应用于构建高性能、高并发的网络应用...

    mina框架中socket使用,有服务端和客户端。

    mina框架是Apache组织开发的一个网络通信框架,它基于Java NIO(非阻塞I/O)构建,用于简化网络编程,尤其是TCP和UDP协议的应用开发。本项目提供了服务端和客户端的示例,使得开发者能够更好地理解和应用MINA框架。 ...

    socket mina测试框架

    - Mina框架支持多种网络协议,如TCP/IP、UDP/IP、SSL/TLS、HTTP、FTP等,使得开发跨协议的应用变得简单。 4. **测试**: - 对于mina测试框架,其目的是验证基于Mina构建的应用程序的正确性和性能。测试包括对通道...

    mina 包 socket 框架

    除了基本的网络通信功能,Mina还提供了许多附加特性,如心跳检测、会话管理、身份验证、SSL/TLS加密等。这些功能使得Mina成为一个全面的网络服务开发框架,能够满足不同应用场景的需求。 在实际项目中,使用Mina...

    Android Java Socket框架 Mina2.0

    1. **事件驱动模型**:Mina采用了非阻塞I/O(NIO)模式,基于Java的Selector API,使得单线程可以高效处理大量并发连接。 2. **协议无关性**:Mina支持多种网络协议,如TCP/IP、UDP、SSL/TLS等,并且可以通过插件化...

    mina及时推送客户端服务端实现

    8. **安全性**:MINA支持SSL/TLS加密,可以保护传输数据的安全。在实际应用中,确保数据传输安全是必不可少的,尤其是在涉及敏感信息的实时推送服务中。 9. **扩展性**:MINA框架的模块化设计使得它易于扩展,可以...

    MINA NIO 高性能异步并发网络通讯框架

    利用 Mina 可以高效地完成以下任务: <br>TCP/IP 和 UDP/IP 通讯 串口通讯 VM 间的管道通讯 SSL/TLS JXM 集成 IoC 容器集成( Spring 、 Pico 等) 状态机 <br>据官方评测, APR 的...

    mina socket 代码

    MinA Socket是Apache软件基金会下的一个开源项目,全称为“MINA (Multi-purpose Infrastructure for Network Applications)”,它提供了一个高性能、可伸缩的网络应用程序框架,用于开发基于TCP/IP和UDP/IP协议的...

    mina服务端例子

    在这个“Mina服务端例子”中,我们主要探讨的是如何使用Mina框架来实现一个基于Socket的非阻塞I/O(NIO)服务端。 1. **Mina框架介绍**: Mina提供了事件驱动和异步处理模型,使得开发者可以专注于业务逻辑,而...

    mina传文件案例,客户端加服务端

    《minafileserver:基于Socket与Mina的文件传输实践》 在IT行业中,网络通信是不可或缺的一部分,尤其是在分布式系统和互联网应用中。Apache Mina是一个轻量级、高性能的网络应用框架,它简化了网络编程,尤其是TCP...

    mina-2.0.4 source code

    MINA的核心理念是提供一套统一的API,让开发者能够处理各种类型的网络协议,如TCP/IP、UDP/IP以及SSL/TLS等,而无需关心底层的I/O实现。在MINA中,所有的网络通信操作都通过事件驱动和异步回调的方式来完成,这使得...

    Apache MINA基于JAVA的网络服务器框架 教程.zip

    5. **丰富的API**:MINA提供了丰富的API,包括Socket和Datagram API,以及用于处理SSL/TLS安全通信的API。 6. **易于扩展**:MINA的设计使得添加新协议或扩展现有功能变得简单。 教程中的文件可能包含以下内容: ...

    mina框架的demo 入门,开发

    Mina框架的强大之处在于它的灵活性和扩展性,你可以根据需求添加更多的过滤器,实现更复杂的功能,比如心跳检测、SSL/TLS加密、性能监控等。 在深入学习Mina时,建议查阅官方文档,参与社区讨论,以及参考已有的...

    apache-mina-2.0.4-bin

    在TCP方面,MINA提供了基于NIO(Non-blocking I/O)的API,可以用于构建高性能的TCP服务器。而在UDP方面,MINA同样支持非阻塞的UDP通信,适用于需要广播或多播的场景。 在"apache-mina-2.0.4-bin"压缩包中,主要...

    mina源代码学习提供下载

    7. **丰富的API**:MINA提供了丰富的API,包括对SSL/TLS的支持,方便开发者构建安全的网络应用。 在“mina-2.0.0-RC1”这个版本中,你可以期待看到以下内容: - **源代码组织**:MINA的源代码通常按照模块进行组织...

    Mina通信框架应用示例

    开发者可以根据需求进一步探索MINA的高级功能,如使用SSL/TLS进行加密通信,或者实现自定义的协议处理器。 总的来说,Mina通信框架提供了一个强大的平台,帮助开发者快速构建网络应用,同时具备高度的灵活性和可...

    mina多线程

    4. **支持多种协议**:除了TCP/IP和UDP/IP之外,Mina还支持SSL/TLS等安全协议。 ### Mina的开发环境搭建 1. **下载并配置依赖库**: - 下载Mina库:访问官方下载页面http://mina.apache.org/downloads.html获取...

Global site tag (gtag.js) - Google Analytics