import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslHandler; import javax.net.ssl.SSLEngine; public class SslChannelInitializer extends ChannelInitializer<Channel> { private final SslContext context; private final boolean startTls; // context:傳入要使用的SslContext // startTls:如果設置為true,第一個寫入的消息將不會被加密(客戶端應該設置為true) public SslChannelInitializer(SslContext context,boolean startTls) { this.context = context; this.startTls = startTls; } @Override protected void initChannel(Channel ch) throws Exception { //對於每個SslHandler 實例,都使用Channel 的ByteBufAllocator 從SslContext 獲取一個新的SSLEngine SSLEngine engine = context.newEngine(ch.alloc()); //將SslHandler作為第一個ChannelHandler添加到ChannelPipeline 中 ch.pipeline().addFirst("ssl",new SslHandler(engine, startTls)); } }