org.jboss.netty.handler.ssl
类 SslHandler

java.lang.Object
  继承者 org.jboss.netty.channel.SimpleChannelUpstreamHandler
      继承者 org.jboss.netty.handler.codec.frame.FrameDecoder
          继承者 org.jboss.netty.handler.ssl.SslHandler
所有已实现的接口:
ChannelDownstreamHandler, ChannelHandler, ChannelUpstreamHandler, LifeCycleAwareChannelHandler

public class SslHandler
extends FrameDecoder
implements ChannelDownstreamHandler, LifeCycleAwareChannelHandler

Channel添加SSL · TLS和StartTLS支持 .了解详细的用法请查阅发布包中的"SecureChat"例子或访问网站.

开始握手

除非你正在重新识别,否则当握手正在进行你不可以写消息.使用handshake() 方法返回的ChannelFuture在握手处理成功或失败时会通知你.

重新识别

由于安全问题,默认情况下TLS重新识别被禁止, CVE-2009 -3555.你可以在风险范围内通过调用参数为true的setEnableRenegotiation(boolean) 启动重新识别.

如果enableRenegotiation返回true 并且初始化握手已经完成,你可以调用 handshake()触发重新识别.

如果enableRenegotiation返回false ,尝试除非重新识别会导致连接关闭.

关闭会话

要关闭SSL会话,必须调用close()发送close_notify消息到远程端.这里会有异常,当你关闭了 Channel - SslHandler拦截关闭请求并在通道关闭之前自动发送close_notify. 一旦SSL会话被关闭,就不可再用,所以你必须使用新的SSLEngine创建一个新的SslHandler ,在接下来部分会有解释.

重启会话

要重新开始SSL会话,你必须从ChannelPipeline移除存在已关闭的SslHandler,插入带有新的 SSLEngineSslHandler,跟着如第一节所描述的开始握手进程.

实现StartTLS

StartTLS是一种固定的纯文本连接的通信模式. 请注意它不同于SSL · TLS,连接一开始就固定了.通常情况下,StartTLS由三个步骤组成:

  1. 客户端发送StartTLS请求到服务端.
  2. 服务端发送StartTLS响应到客户端.
  3. 客户端开始SSL握手.
如果你实现一个服务端,你需要:
  1. 使用startTls标识为true创建一个SslHandler
  2. 插入SslHandlerChannelPipeline
  3. 写一个StartTLS响应.
请注意你必须在发送StartTLS响应之前插入.否则在SslHandler被插入到 ChannelPipeline之前客户端可以发送开始SSL握手请求,导致数据错误.

客户端实现就更简单了.

  1. 写一个StartTLS请求
  2. 等待StartTLS响应
  3. 使用startTls标识为false创建一个SslHandler
  4. 插入SslHandlerChannelPipeline
  5. 调用handshake()初始SSL握手.


嵌套类摘要
 
从接口 org.jboss.netty.channel.ChannelHandler 继承的嵌套类/接口
ChannelHandler.Sharable
 
构造方法摘要
SslHandler(javax.net.ssl.SSLEngine engine)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, boolean startTls)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, boolean startTls, java.util.concurrent.Executor delegatedTaskExecutor)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, java.util.concurrent.Executor delegatedTaskExecutor)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, SslBufferPool bufferPool)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, SslBufferPool bufferPool, boolean startTls)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, SslBufferPool bufferPool, boolean startTls, java.util.concurrent.Executor delegatedTaskExecutor)
          创建一个实例.
SslHandler(javax.net.ssl.SSLEngine engine, SslBufferPool bufferPool, java.util.concurrent.Executor delegatedTaskExecutor)
          创建一个实例.
 
方法摘要
 void afterAdd(ChannelHandlerContext ctx)
           
 void afterRemove(ChannelHandlerContext ctx)
           
 void beforeAdd(ChannelHandlerContext ctx)
           
 void beforeRemove(ChannelHandlerContext ctx)
           
 void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e)
          当一个Channel被远程端断开连接时调用.
 ChannelFuture close()
          发送一个SSL close_notify消息到指定的Channel并销毁底层SSLEngine.
 ChannelFuture close(Channel channel)
          已过时。 已被close()代替.
 void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
          当一个I/O线程或ChannelHandler抛出异常时被调用.
static SslBufferPool getDefaultBufferPool()
          返回在构造器没有指定池时使用的SslBufferPool.
 javax.net.ssl.SSLEngine getEngine()
          返回被该处理器使用的SSLEngine.
 void handleDownstream(ChannelHandlerContext context, ChannelEvent evt)
          处理指定的下游事件.
 ChannelFuture handshake()
          为指定Channel开始SSL/TLS握手.
 ChannelFuture handshake(Channel channel)
          已过时。 已被handshake()代替.
 boolean isEnableRenegotiation()
          只用当允许TLS识别才返回true.
 void setEnableRenegotiation(boolean enableRenegotiation)
          允许或禁止TLS识别.
 
从类 org.jboss.netty.handler.codec.frame.FrameDecoder 继承的方法
channelClosed, messageReceived
 
从类 org.jboss.netty.channel.SimpleChannelUpstreamHandler 继承的方法
channelBound, channelConnected, channelInterestChanged, channelOpen, channelUnbound, childChannelClosed, childChannelOpen, handleUpstream, writeComplete
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  SslBufferPool bufferPool)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
bufferPool - 获取该处理器使用的SSLEngine需要的缓冲的SslBufferPool

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  boolean startTls)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
startTls - true表示SSLEngine第一个写请求不需要加密

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  SslBufferPool bufferPool,
                  boolean startTls)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
bufferPool - 获取该处理器使用的SSLEngine需要的缓冲的SslBufferPool
startTls - true表示SSLEngine第一个写请求不需要加密

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  java.util.concurrent.Executor delegatedTaskExecutor)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
delegatedTaskExecutor - 执行SSLEngine.getDelegatedTask()返回的委派任务的Executor

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  SslBufferPool bufferPool,
                  java.util.concurrent.Executor delegatedTaskExecutor)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
bufferPool - 获取该处理器使用的SSLEngine需要的缓冲的SslBufferPool
delegatedTaskExecutor - 执行SSLEngine.getDelegatedTask()返回的委派任务的Executor

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  boolean startTls,
                  java.util.concurrent.Executor delegatedTaskExecutor)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
startTls - true表示SSLEngine第一个写请求不需要加密
delegatedTaskExecutor - 执行SSLEngine.getDelegatedTask()返回的委派任务的Executor

SslHandler

public SslHandler(javax.net.ssl.SSLEngine engine,
                  SslBufferPool bufferPool,
                  boolean startTls,
                  java.util.concurrent.Executor delegatedTaskExecutor)
创建一个实例.

参数:
engine - 该处理器使用的SSLEngine
bufferPool - 获取该处理器使用的SSLEngine需要的缓冲的SslBufferPool
startTls - true表示SSLEngine第一个写请求不需要加密
delegatedTaskExecutor - 执行SSLEngine.getDelegatedTask()返回的委派任务的Executor
方法详细信息

getDefaultBufferPool

public static SslBufferPool getDefaultBufferPool()
返回在构造器没有指定池时使用的SslBufferPool.


getEngine

public javax.net.ssl.SSLEngine getEngine()
返回被该处理器使用的SSLEngine.


handshake

public ChannelFuture handshake()
为指定Channel开始SSL/TLS握手.

返回:
当握手成功或失败会被通知的ChannelFuture.

handshake

@Deprecated
public ChannelFuture handshake(Channel channel)
已过时。 已被handshake()代替.


close

public ChannelFuture close()
发送一个SSL close_notify消息到指定的Channel并销毁底层SSLEngine.


close

@Deprecated
public ChannelFuture close(Channel channel)
已过时。 已被close()代替.


isEnableRenegotiation

public boolean isEnableRenegotiation()
只用当允许TLS识别才返回true.


setEnableRenegotiation

public void setEnableRenegotiation(boolean enableRenegotiation)
允许或禁止TLS识别.


handleDownstream

public void handleDownstream(ChannelHandlerContext context,
                             ChannelEvent evt)
                      throws java.lang.Exception
从接口 ChannelDownstreamHandler 复制的描述
处理指定的下游事件.

指定者:
接口 ChannelDownstreamHandler 中的 handleDownstream
参数:
context - 处理器的上下文对象
evt - 要处理或拦截的事件
抛出:
java.lang.Exception

channelDisconnected

public void channelDisconnected(ChannelHandlerContext ctx,
                                ChannelStateEvent e)
                         throws java.lang.Exception
从类 SimpleChannelUpstreamHandler 复制的描述
当一个Channel被远程端断开连接时调用.

覆盖:
FrameDecoder 中的 channelDisconnected
抛出:
java.lang.Exception

exceptionCaught

public void exceptionCaught(ChannelHandlerContext ctx,
                            ExceptionEvent e)
                     throws java.lang.Exception
从类 SimpleChannelUpstreamHandler 复制的描述
当一个I/O线程或ChannelHandler抛出异常时被调用.

覆盖:
FrameDecoder 中的 exceptionCaught
抛出:
java.lang.Exception

beforeAdd

public void beforeAdd(ChannelHandlerContext ctx)
               throws java.lang.Exception
指定者:
接口 LifeCycleAwareChannelHandler 中的 beforeAdd
抛出:
java.lang.Exception

afterAdd

public void afterAdd(ChannelHandlerContext ctx)
              throws java.lang.Exception
指定者:
接口 LifeCycleAwareChannelHandler 中的 afterAdd
抛出:
java.lang.Exception

beforeRemove

public void beforeRemove(ChannelHandlerContext ctx)
                  throws java.lang.Exception
指定者:
接口 LifeCycleAwareChannelHandler 中的 beforeRemove
抛出:
java.lang.Exception

afterRemove

public void afterRemove(ChannelHandlerContext ctx)
                 throws java.lang.Exception
指定者:
接口 LifeCycleAwareChannelHandler 中的 afterRemove
抛出:
java.lang.Exception