前面写的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")))); /*
时间: 2024-10-22 19:48:59