Netty 添加SSL双向认证

  1. SSL验证Handler创建.
       //1.使用秘钥库给对方进行身份验证
        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(new FileInputStream("/home/my.jks"), "1234567".toCharArray());
        //2.使用某个证书验证
        KeyStore keyStore2 = KeyStore.getInstance("JKS");
        keyStore2.load(null, null);
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        Certificate certificate = factory.generateCertificate(new FileInputStream("/home/my.cer"));
        keyStore2.setCertificateEntry("my",certificate);

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyManagerFactory.init(keyStore, "654321".toCharArray());
//        keyManagerFactory.init(keyStore2, "654321".toCharArray());

        //本机证书,从秘钥库获取.
        KeyStore trustStore = KeyStore.getInstance("JKS");
        trustStore.load(new FileInputStream("home/my.jks"), "1234567".toCharArray());
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(trustStore);

        //init SSLContext实例
        SSLContext sslContext = SSLContext.getInstance("TLS");
        //keyManagerFactory 自己的身份证,trustManagerFactory 自己的验证器
        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
        //服务端
        SSLEngine sslEngine = sslContext.createSSLEngine();
        sslEngine.setNeedClientAuth(true);
        sslEngine.setUseClientMode(false);
        //客户端
        sslEngine.setNeedClientAuth(true);
        sslEngine.setUseClientMode(true);

        //pipeline SslHandler,放在addLast最前

        SslHandler tlsHandler = new SslHandler(sslEngine, false);
        /*
         * RSA签名认证
         * pipeline.addLast(tlsHandler) ;
         *
         **/

2.netty配置

        //配置netty服务
        nettyBoot.group(bossEventLoop, workerEventLoop)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 100)
                .handler(new LoggingHandler(LogLevel.INFO))
                .childHandler(new ChannelInitializer<Channel>() {
                    @Override
                    protected void initChannel(Channel ch) {
                        ChannelPipeline pipeline = ch.pipeline();
                        //RSA签名认证
                        pipeline.addLast(tlsHandler) ;
                        //入站,1,2,3出站5,4
                        pipeline.addLast(new LoggingHandler(LogLevel.INFO)) //日志打印
                                .addLast("4", prepender)//4 分包,bytes -> http数据包
                                .addLast("5", encoder)//5 //msg -> bytes
                                .addLast("1", new LengthFieldBasedFrameDecoder(1000000, 0, 4, -4, 4))//1,http网络数据包,组包
                                .addLast("2", decoder)//2 //bytes -> msg ,自定义解码
                                .addLast("3", msgServerHandler);//3 //msg -> msg,数据转换,转发数据
                    }
                });
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Netty的简单介绍 Netty 是一个 NIO client-server(客户端服务器)框架,使用 Netty...
    AI乔治阅读 12,683评论 1 101
  • Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架...
    认真期待阅读 7,755评论 1 27
  • 前奏 https://tech.meituan.com/2016/11/04/nio.html 综述 netty通...
    jiangmo阅读 11,278评论 0 13
  • Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架...
    AI乔治阅读 7,645评论 0 32
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,224评论 19 139

友情链接更多精彩内容