开启SSL

    开启SSL非常简单,getty已经提供了易用且健壮的SSL实现。服务端与客户端唯一的区别就是 setClientMode(),服务器端需设置为false。

    1. AioServerStarter server = new AioServerStarter(8888);
    2. server.channelInitializer(new ChannelInitializer() {
    3. @Override
    4. public void initChannel(AioChannel channel) throws Exception {
    5. DefaultChannelPipeline defaultChannelPipeline = channel.getDefaultChannelPipeline();
    6. //获取证书
    7. String pkPath = ResourceUtils.getURL("classpath:serverStore.jks")
    8. .getPath();
    9. //ssl配置
    10. SslConfig sSLConfig = new SslConfig();
    11. sSLConfig.setKeyFile(pkPath);
    12. sSLConfig.setKeyPassword("123456");
    13. sSLConfig.setKeystorePassword("123456");
    14. sSLConfig.setTrustFile(pkPath);
    15. sSLConfig.setTrustPassword("123456");
    16. //设置服务器模式
    17. sSLConfig.setClientMode(false);
    18. //设置单向验证或双向验证
    19. sSLConfig.setClientAuth(ClientAuth.NONE);
    20. //初始化ssl服务,默认protocolVersion="TLSv1.2",可通过构造方法指定
    21. SslService sSLService = new SslService(sSLConfig);
    22. //把ssl插件注入责任链即可,需要添加到责任链的第一位
    23. defaultChannelPipeline.addFirst(new SslHandler(channel,sSLService));
    24. defaultChannelPipeline.addLast(new DelimiterFrameDecoder(DelimiterFrameDecoder.lineDelimiter));
    25. defaultChannelPipeline.addLast(new StringDecoder());
    26. defaultChannelPipeline.addLast(new SimpleHandler());
    27. }
    28. });
    29. server.start();

    SslConfig 参数| 参数名 | 数据类型 | 备注 || ———————— | ———— | —————————————————————————————————————— || clientMode | boolean | 配置引擎在握手时使用客户端(或服务器)模式 || keyFile | String | keystore路径 || keystorePassword | String | keystore密码 || keyPassword | String | 管理密钥,需要key的密码,通常是keystore密码,这个密码也可以为null || trustFile | String | 签名证书路径,通常签名证书直接使用jks,也就是上面的keystore文件,并非cer文件 || trustPassword | String | 签名证书密码 |

    ClientAuth

    参数 类型 备注
    NONE boolean 单向验证
    REQUIRE boolean 双向向验证

    客户端示例

    1. AioClientStarter client = new AioClientStarter(aioConfig);
    2. client.channelInitializer(new ChannelInitializer() {
    3. @Override
    4. public void initChannel(AioChannel channel) throws Exception {
    5. //责任链
    6. DefaultChannelPipeline defaultChannelPipeline = channel.getDefaultChannelPipeline();
    7. //当服务器端配置为单向认证时,客户端只需开启ssl。可以不配置证书,双向认证则客户端需要配置证书
    8. SslConfig sSLConfig = new SslConfig();
    9. //别忘了设置为客户端模式
    10. sSLConfig.setClientMode(true);
    11. SslService sSLService = new SslService(sSLConfig);
    12. defaultChannelPipeline.addFirst(new SslHandler(channel,sSLService));
    13. //指定结束符解码器
    14. defaultChannelPipeline.addLast(new DelimiterFrameDecoder(DelimiterFrameDecoder.lineDelimiter));
    15. //字符串解码器
    16. defaultChannelPipeline.addLast(new StringDecoder());
    17. //定义消息解码器
    18. defaultChannelPipeline.addLast(new SimpleHandler());
    19. }
    20. });
    21. try {
    22. client.start();
    23. } catch (Exception e) {
    24. e.printStackTrace();
    25. }