前面寫的Mina的示例,都是可以通過telnet登錄的,並且可以相互交互。
現在采用ssl加密的方式,對建立連接時,進行加密連接。這樣,雙方只有統一的加密,然后才可以連接。
密鑰的生成之前有說過,里面有引用站內某個程序員的博文,這里用的代碼也是出自他手。
package com.example.mina.ssl; import java.io.File; import java.security.KeyStore; import javax.net.ssl.SSLContext; import org.apache.mina.filter.ssl.KeyStoreFactory; import org.apache.mina.filter.ssl.SslContextFactory; public class SSLContextGenerator { /** * 這個方法,通過keystore和truststore文件返回一個SSLContext對象 * * @return */ public SSLContext getSslContext() { SSLContext sslContext = null; try { /* * 提供keystore的存放目錄,讀取keystore的文件內容 */ File keyStoreFile = new File("G:/ssl/keystore.jks"); /* * 提供truststore的存放目錄,讀取truststore的文件內容 */ File trustStoreFile = new File( "G:/ssl/truststore.jks"); if (keyStoreFile.exists() && trustStoreFile.exists()) { final KeyStoreFactory keyStoreFactory = new KeyStoreFactory(); System.out.println("Url is: " + keyStoreFile.getAbsolutePath()); keyStoreFactory.setDataFile(keyStoreFile); /* * 這個是當初我們使用keytool創建keystore和truststore文件的密碼,也是上次讓你們一定要記住密碼的原因了 */ keyStoreFactory.setPassword("123456"); final KeyStoreFactory trustStoreFactory = new KeyStoreFactory(); trustStoreFactory.setDataFile(trustStoreFile); trustStoreFactory.setPassword("123456"); final SslContextFactory sslContextFactory = new SslContextFactory(); final KeyStore keyStore = keyStoreFactory.newInstance(); sslContextFactory.setKeyManagerFactoryKeyStore(keyStore); final KeyStore trustStore = trustStoreFactory.newInstance(); sslContextFactory.setTrustManagerFactoryKeyStore(trustStore); sslContextFactory .setKeyManagerFactoryKeyStorePassword("123456"); sslContext = sslContextFactory.newInstance(); System.out.println("SSL provider is: " + sslContext.getProvider()); } else { System.out .println("Keystore or Truststore file does not exist"); } } catch (Exception ex) { ex.printStackTrace(); } return sslContext; } }
然后在客戶端和服務端都注冊一個占據在第一個位置的ssl過濾器,這樣ssl就生效了。
/* * 獲取過濾器鏈,用於添加過濾器 */ DefaultIoFilterChainBuilder chain = connector.getFilterChain(); /* * 2.為連接添加過濾器,SSL、日志、編碼過濾器 */ // SSLContextGenerator是我們自己寫的一個SSL上下文產生器,稍后會講到 SslFilter sslFilter = new SslFilter( new SSLContextGenerator().getSslContext()); // 設置為客戶端模式 sslFilter.setUseClientMode(true); // a.ssl過濾器,這個一定要第一個添加,否則數據不會進行加密 chain.addFirst("sslFilter", sslFilter); // b.添加日志過濾器 chain.addLast("logger", new LoggingFilter()); // c.添加字符的編碼過濾器 chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); /*