zoukankan      html  css  js  c++  java
  • Netty5使用自签证书实现SSL安全连接

    这次使用的Netty是最新的5.0 Alpha2版本,下载地址是:http://dl.bintray.com/netty/downloads/netty-5.0.0.Alpha2.tar.bz2,发布时间是2015年3月,到现在快一年了,咋还不更新呢?有些奇怪……

    制作一张自签证书(jks格式)

    #keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -dnam e "CN=gornix.com" -keypass 654321 -storepass 123456 -keystore gornix.jks

    keytool为JDK提供的生成证书工具

    • -keysize 2048 密钥长度2048位(这个长度的密钥目前可认为无法被暴力破解)
    • -validity 365 证书有效期365天
    • -keyalg RSA 使用RSA非对称加密算法
    • -dname "CN=gornix.com" 设置Common Name为gornix.com,这是我的域名
    • -keypass 654321 密钥的访问密码为654321
    • -storepass 123456 密钥库的访问密码为123456(其实这两个密码也可以设置一样,通常都设置一样,方便记)
    • -keystore gornix.jks 指定生成的密钥库文件为gornix.jks

    完了之后就拿到了gornix.jks这个密钥库文件了,把它放到自己的home目录下,比如:/home/guogangj/gornix.jks

    在程序初始化的时候生成SSLContext

    keyStore ks = KeyStore.getInstance("JKS");
    InputStream ksInputStream = new FileInputStream("/home/guogangj/gornix.jks");
    ks.load(ksInputStream, "123456".toCharArray());
    keyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(ks, "654321".toCharArray());
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(kmf.getKeyManagers(), null, null);

    这个过程在整个程序周期只需要做一次,最好try-catch一下,以便检查异常,好了之后保存好sslContext,后面用到。

    在ChannelInitializer的initChannel中

    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
    SSLEngine sslEngine = sslContext.createSSLEngine();
    sslEngine.setUseClientMode(false); //服务器端模式
    sslEngine.setNeedClientAuth(false); //不需要验证客户端
    socketChannel.pipeline().addLast("ssl", new SslHandler(sslEngine)); //搞定
    //...
    }

    sslContext就是前面生成的那个sslContext,通常可以用参数的形式传入到ChannelInitializer中。还有,记得把SslHandler放在其它Handler的前面。

    完成

    搞定了,easy?可见SSL也没什么神秘的,就是在普通的TCP连接基础上包了一层处理而已(但如果要自己实现这层处理那可是相当复杂的),这层处理体现在Netty中就是一个SslHandler,把这个SslHandler加入到TCP连接的处理管线中即可。这篇文章并不是一篇完整的教程,本来我打算把它写得完整一点,但这得花费较长的时间和篇幅,Netty虽然大大简化了Java的网络程序的开发,但要从头到尾讲清楚,也蛮有难度的,学习Netty目前主要有这两本书:国内作者写的《Netty权威指南》和国外作者写的《Netty in Action》,英文好的当然推荐看后者,但两本书都不是针对最新的Netty 5.0所写,所以想深入的话还得看看Netty的源代码和官方文档(个人觉得也不太完善)。以后看看有没有时间,有的话再写些完整的教程出来。

  • 相关阅读:
    JavaSE-方法覆盖的注意事项
    underscore.js源码研究(4)
    underscore.js源码研究(3)
    移动端font-size适配方案
    控制台引入想要的库
    页面布局与编写(续3)
    underscore.js源码研究(2)
    全屏使用swiper.js过程中遇到的坑
    模块加载
    underscore.js源码研究(1)
  • 原文地址:https://www.cnblogs.com/guogangj/p/5209330.html
Copyright © 2011-2022 走看看