1. 程式人生 > >基於 MINA 的 TLS/SSL NIO Socket 實現(一)

基於 MINA 的 TLS/SSL NIO Socket 實現(一)

[color=blue]功能: 伺服器啟動後只支援 TLS/SSL 方式連線[/color][color=darkred](不接受普通連線)[/color]
[color=blue]備註: TLS/SSL 實現是基於 MINA 的官方例子
地址: http://mina.apache.org/[/color]

[color=darkred]客戶端和伺服器端通訊內容:[/color]
[color=violet]客戶端:我是安全的嗎?[/color]
[color=green]伺服器:安全連結已建立![/color]

[color=darkred]伺服器端程式碼:[/color]

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.filter.ssl.SslFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import com.sariel.tls.BogusSslContextFactory;

public class TLSServer {

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();
SslFilter sslFilter = new SslFilter(BogusSslContextFactory.getInstance(true));
/** 設定加密過濾器 **/
chain.addLast("sslFilter", sslFilter);
/** 設定編碼過濾器和按行讀取資料模式 **/
chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
/** 設定事件處理器 **/
acceptor.setHandler(new TLSServerHandler());
/** 服務繫結到此埠號 **/
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;

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

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");
System.out.println("[NIO Server Received]>> : "+(String) message);
session.write("安全連結已建立!");
}

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

[color=darkred]客戶端程式碼:[/color]

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.filter.ssl.SslFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import com.sariel.tls.BogusSslContextFactory;

public class TLSClient {

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();
SslFilter connectorTLSFilter = new SslFilter(BogusSslContextFactory.getInstance(false));
/** 設定為客戶端模式 **/
connectorTLSFilter.setUseClientMode(true);
/** 設定加密過濾器 **/
connector.getFilterChain().addLast("SSL", connectorTLSFilter);
/** 設定事件處理器 **/
connector.setHandler(new TLSClientHandler());
/** 設定編碼過濾器和按行讀取資料模式 **/
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("我是安全的嗎?");
/** 等待連線斷開 **/
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;

public class TLSClientHandler 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);
}

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

原始檔下載地址:[url]http://sariel.iteye.com/blog/470383[/url]
或直接下載地址:[url]http://dl.iteye.com/topics/download/432bf891-ec7c-31be-a7a4-ec1f67a4dd9d[/url]