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"))));

        /*

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM