為了支持 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; // 第一次請求是否加密 5 6 public SslChannelInitializer(SslContext context, boolean client, boolean startTls) { 7 this.context = context; 8 this.client = client; 9 this.startTls = startTls; 10 } 11 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 } 20 21 }
如上所示,SslHandler 使用 ChannelInitializer 添加到 ChannelPipeline。在大多數情況下,SslHandler 將成為 ChannelPipeline 的第一個 ChannelHandler。
SslHandler 還有很多有用的方法,如下:

