zoukankan      html  css  js  c++  java
  • Mina的ssl加密

    前面写的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"))));
    
            /*
  • 相关阅读:
    springboot文件上传: 单个文件上传 和 多个文件上传
    Eclipse:很不错的插件-devStyle,将你的eclipse变成idea风格
    springboot项目搭建:结构和入门程序
    POJ 3169 Layout 差分约束系统
    POJ 3723 Conscription 最小生成树
    POJ 3255 Roadblocks 次短路
    UVA 11367 Full Tank? 最短路
    UVA 10269 Adventure of Super Mario 最短路
    UVA 10603 Fill 最短路
    POJ 2431 Expedition 优先队列
  • 原文地址:https://www.cnblogs.com/juepei/p/3940910.html
Copyright © 2011-2022 走看看