为了支持 SSL/TLS,Java 提供了 javax.net.ssl API 的类 SslContext 和 SslEngine 使它相对简单的实现解密和加密。Netty 利用该 API 实现了 ChannelHandler 的子类 SslHandler。下图为 Sslhandler 的数据流图:
加密的入站数据被 SslHandler 拦截,进行解密
数据被解密后,原始数据入站
原始数据经过 SslHandler
SslHandler 加密数据并传递数据出站
下面是 SslHandler 的一个简单使用:
1 public class SslChannelInitializer extends ChannelInitializer<Channel> {
2 private final SslContext context;
3 private final boolean client;
4 private final boolean startTls; // 第一次请求是否加密
6 public SslChannelInitializer(SslContext context, boolean client, boolean startTls) {
7 this.context = context;
8 this.client = client;
9 this.startTls = startTls;
10 }
12 @Override
13 protected void initChannel(Channel ch) throws Exception {
14 // 给每个 SslHandler 实例使用一个新的 SslEngine
15 SSLEngine engine = context.newEngine(ch.alloc());
16 engine.setUseClientMode(client); // 设置SslEngine是client或者是server模式
17 // 添加SslHandler到pipeline作为第一个处理器
18 ch.pipeline().addFirst("ssl", new SslHandler(engine, startTls));
19 }
如上所示,SslHandler 使用 ChannelInitializer 添加到 ChannelPipeline。在大多数情况下,SslHandler 将成为 ChannelPipeline 的第一个 ChannelHandler。
SslHandler 还有很多有用的方法,如下: