public class SslHandler extends ByteToMessageDecoder implements ChannelOutboundHandler
Channel
。
有关详细用法,请参阅发行版或网站中的“SecureChat”示例。
除了使用握手ChannelFuture
来获得握手完成的通知之外,还可以通过执行ChannelInboundHandler.userEventTriggered(ChannelHandlerContext, Object)
方法来检测它,并检查SslHandshakeCompletionEvent
。
一旦Channel
处于活动状态, SSLEngine.getUseClientMode()
返回true
,握手将自动发出。 所以不需要你自己去打扰它。
要关闭SSL会话,应调用close()
方法将close_notify
消息发送到远程对等方。 一个例外是,当您关闭Channel
- SslHandler
时会截获关闭请求并自动在通道关闭前发送close_notify
消息。 SSL会话关闭后,它不可重用,因此您应该创建一个新的SslHandler
,并带有新的SSLEngine
如下一节所述。
要重新启动SSL会话,则必须删除现有的封闭SslHandler
从ChannelPipeline
,插入一个新SslHandler
用新SSLEngine
进入管道,并在第一部分中描述开始握手过程。
StartTLS是在明文连接中间保护线路的通信模式。 请注意,它与SSL?TLS不同,它可以在连接开始时保护连线。 通常,StartTLS由三个步骤组成:
SslHandler
实例,其中startTls
标志设置为true
, SslHandler
插入到ChannelPipeline
,然后 SslHandler
。
否则客户端可以在将SslHandler
插入到ChannelPipeline
之前发送开始SSL握手,从而导致数据损坏。
客户端实现要简单得多。
SslHandler
实例,其中startTls
标志设置为false
, SslHandler
插入到ChannelPipeline
,然后 由于Java自带的SslEngine的当前实现存在已知问题,因此在完成完整的GC时可能会看到阻塞的IO线程。
所以如果你受到影响,你可以通过调整缓存设置来解决这个问题,如下所示:
SslContext context = ...;
context.getServerSessionContext().setSessionCacheSize(someSaneSize);
context.getServerSessionContext().setSessionTime(someSameTimeout);
这里使用的值取决于应用程序的性质,应该根据监视和调试来设置。 有关更多详细信息,请参阅我们的问题跟踪器中的#832 。
ByteToMessageDecoder.Cumulator
ChannelHandler.Sharable
COMPOSITE_CUMULATOR, MERGE_CUMULATOR
Constructor and Description |
---|
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(SSLEngine) 。
|
Modifier and Type | Method and Description |
---|---|
java.lang.String |
applicationProtocol()
返回当前应用程序级协议的名称。
|
void |
bind(ChannelHandlerContext ctx, java.net.SocketAddress localAddress, ChannelPromise promise)
调用一次绑定操作。
|
void |
channelActive(ChannelHandlerContext ctx)
在客户端模式下使用时连接发起初始TLS握手
|
void |
channelInactive(ChannelHandlerContext ctx)
|
void |
channelReadComplete(ChannelHandlerContext ctx)
|
ChannelFuture |
close()
|
void |
close(ChannelHandlerContext ctx, ChannelPromise promise)
一旦进行了密切的操作,就会被调用。
|
ChannelFuture |
close(ChannelPromise promise)
|
void |
connect(ChannelHandlerContext ctx, java.net.SocketAddress remoteAddress, java.net.SocketAddress localAddress, ChannelPromise promise)
连接操作完成后调用。
|
protected void |
decode(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out)
解码从一个 ByteBuf 到另一个。
|
void |
deregister(ChannelHandlerContext ctx, ChannelPromise promise)
一旦从当前注册的 EventLoop 进行撤销注册操作,就会被调用。
|
void |
disconnect(ChannelHandlerContext ctx, ChannelPromise promise)
调用一次断开操作。
|
javax.net.ssl.SSLEngine |
engine()
返回此处理程序使用的
SSLEngine 。
|
void |
exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause)
|
void |
flush(ChannelHandlerContext ctx)
调用一次冲洗操作。
|
long |
getCloseNotifyFlushTimeoutMillis()
获取刷新关闭 Channel 触发的close_notify的超时时间。
|
long |
getCloseNotifyReadTimeoutMillis()
|
long |
getCloseNotifyTimeoutMillis()
|
long |
getHandshakeTimeoutMillis() |
void |
handlerAdded(ChannelHandlerContext ctx)
子类可以忽略这个方法。
|
void |
handlerRemoved0(ChannelHandlerContext ctx)
在 ByteToMessageDecoder 从实际上下文中移除之后调用,它不再处理事件。
|
Future<Channel> |
handshakeFuture()
返回一个当前TLS握手完成后会通知的 Future 。
|
static boolean |
isEncrypted(ByteBuf buffer)
如果给定的 ByteBuf 已加密,则返回true 。
|
void |
read(ChannelHandlerContext ctx)
|
Future<Channel> |
renegotiate()
执行TLS重新协商。
|
Future<Channel> |
renegotiate(Promise<Channel> promise)
执行TLS重新协商。
|
void |
setCloseNotifyFlushTimeout(long closeNotifyFlushTimeout, java.util.concurrent.TimeUnit unit)
设置刷新由关闭 Channel 触发的close_notify的超时 。
|
void |
setCloseNotifyFlushTimeoutMillis(long closeNotifyFlushTimeoutMillis)
|
void |
setCloseNotifyReadTimeout(long closeNotifyReadTimeout, java.util.concurrent.TimeUnit unit)
设置接收关闭 Channel 触发的close_notify响应的超时时间。
|
void |
setCloseNotifyReadTimeoutMillis(long closeNotifyReadTimeoutMillis)
|
void |
setCloseNotifyTimeout(long closeNotifyTimeout, java.util.concurrent.TimeUnit unit)
|
void |
setCloseNotifyTimeoutMillis(long closeNotifyFlushTimeoutMillis)
|
void |
setHandshakeTimeout(long handshakeTimeout, java.util.concurrent.TimeUnit unit) |
void |
setHandshakeTimeoutMillis(long handshakeTimeoutMillis) |
void |
setWrapDataSize(int wrapDataSize)
设置传递给每个
SSLEngine.wrap(ByteBuffer[], int, int, ByteBuffer) 调用的字节数。
|
Future<Channel> |
sslCloseFuture()
返回 Future ,如果SSLEngine 的入站已关闭,将会收到通知。
|
void |
write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise)
一旦写入操作被调用,就调用它。
|
actualReadableBytes, callDecode, channelRead, decodeLast, discardSomeReadBytes, handlerRemoved, internalBuffer, isSingleDecode, setCumulator, setDiscardAfterReads, setSingleDecode, userEventTriggered
channelRegistered, channelUnregistered, channelWritabilityChanged
ensureNotSharable, isSharable
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
handlerRemoved
public SslHandler(javax.net.ssl.SSLEngine engine)
engine
- 此处理程序将使用
SSLEngine
public SslHandler(javax.net.ssl.SSLEngine engine, boolean startTls)
engine
- 该处理程序将使用
SSLEngine
startTls
-
true
如果第一个写入请求不应该由
SSLEngine
加密
@Deprecated public SslHandler(javax.net.ssl.SSLEngine engine, java.util.concurrent.Executor delegatedTaskExecutor)
SslHandler(SSLEngine)
。
@Deprecated public SslHandler(javax.net.ssl.SSLEngine engine, boolean startTls, java.util.concurrent.Executor delegatedTaskExecutor)
SslHandler(SSLEngine, boolean)
。
public long getHandshakeTimeoutMillis()
public void setHandshakeTimeout(long handshakeTimeout, java.util.concurrent.TimeUnit unit)
public void setHandshakeTimeoutMillis(long handshakeTimeoutMillis)
@UnstableApi public final void setWrapDataSize(int wrapDataSize)
SSLEngine.wrap(ByteBuffer[], int, int, ByteBuffer)
调用的字节数。
该值将分割传递给写入write(ChannelHandlerContext, Object, ChannelPromise)
的数据 。 分区工作如下:
wrapDataSize <= 0
那么我们将按wrapDataSize <= 0
写入每个数据块。 wrapDataSize > data size
那么我们将尝试将多个数据块聚合在一起。 wrapDataSize > data size
否则如果wrapDataSize <= data size
那么我们将在写入时将数据分成wrapDataSize
块。 如果SSLEngine
不支持收集包装操作(例如SslProvider.OPENSSL
),那么在包装之前聚合数据可以帮助减少TLS开销与数据负载之间的比率,这将导致更好的吞吐量。 编写固定的数据块也可以帮助定位底层传输的(例如TCP)帧大小。 在有损/拥塞的网络条件下,这可以帮助对方更早地获得完整的TLS数据包,并且能够尽快完成工作,而不是等待所有TLS数据包到达。
wrapDataSize
- 将传递给每个
SSLEngine.wrap(ByteBuffer[], int, int, ByteBuffer)
调用的字节数。
@Deprecated public long getCloseNotifyTimeoutMillis()
@Deprecated public void setCloseNotifyTimeout(long closeNotifyTimeout, java.util.concurrent.TimeUnit unit)
@Deprecated public void setCloseNotifyTimeoutMillis(long closeNotifyFlushTimeoutMillis)
public final long getCloseNotifyFlushTimeoutMillis()
Channel
触发的close_notify的超时 。
如果close_notify在给定的超时时间内未刷新,则强制关闭Channel
。
public final void setCloseNotifyFlushTimeout(long closeNotifyFlushTimeout, java.util.concurrent.TimeUnit unit)
Channel
触发的close_notify超时 。
如果close_notify未在给定的超时时间内刷新,则强制关闭Channel
。
public final void setCloseNotifyFlushTimeoutMillis(long closeNotifyFlushTimeoutMillis)
public final long getCloseNotifyReadTimeoutMillis()
public final void setCloseNotifyReadTimeout(long closeNotifyReadTimeout, java.util.concurrent.TimeUnit unit)
public final void setCloseNotifyReadTimeoutMillis(long closeNotifyReadTimeoutMillis)
public javax.net.ssl.SSLEngine engine()
SSLEngine
。
public java.lang.String applicationProtocol()
null
如果应用程序级协议尚未协商)
public Future<Channel> handshakeFuture()
Future
。
Future
初始TLS握手如果renegotiate()
没有被引用。
该Future
为最近TLS renegotiation其他。
@Deprecated public ChannelFuture close()
close_notify
消息发送到指定的通道并销毁底层的
SSLEngine
。
@Deprecated public ChannelFuture close(ChannelPromise promise)
close()
public void handlerRemoved0(ChannelHandlerContext ctx) throws java.lang.Exception
ByteToMessageDecoder
ByteToMessageDecoder
已从实际上下文中移除并且不再处理事件之后调用。
handlerRemoved0
在课堂上
ByteToMessageDecoder
java.lang.Exception
public void bind(ChannelHandlerContext ctx, java.net.SocketAddress localAddress, ChannelPromise promise) throws java.lang.Exception
ChannelOutboundHandler
复制的描述
bind
,界面
ChannelOutboundHandler
ctx
- 为其进行绑定操作的ChannelHandlerContext
localAddress
- 它应该绑定的
SocketAddress
promise
- 在操作完成后通知ChannelPromise
java.lang.Exception
- 发生错误时抛出
public void connect(ChannelHandlerContext ctx, java.net.SocketAddress remoteAddress, java.net.SocketAddress localAddress, ChannelPromise promise) throws java.lang.Exception
ChannelOutboundHandler
connect
在界面
ChannelOutboundHandler
ctx
- 进行连接操作的ChannelHandlerContext
remoteAddress
- 它应该连接到的
SocketAddress
localAddress
- 用作连接源的
SocketAddress
promise
- 在操作完成后通知ChannelPromise
java.lang.Exception
- 发生错误时抛出
public void deregister(ChannelHandlerContext ctx, ChannelPromise promise) throws java.lang.Exception
ChannelOutboundHandler
复制的描述
EventLoop
进行撤销注册操作,就会被调用。
deregister
,界面
ChannelOutboundHandler
ctx
- 关闭操作的ChannelHandlerContext
promise
- 在操作完成后通知ChannelPromise
java.lang.Exception
- 发生错误时抛出
public void disconnect(ChannelHandlerContext ctx, ChannelPromise promise) throws java.lang.Exception
ChannelOutboundHandler
复制的描述
disconnect
在界面
ChannelOutboundHandler
ctx
- 进行断开操作的ChannelHandlerContext
promise
- 在操作完成后通知ChannelPromise
java.lang.Exception
- 发生错误时抛出
public void close(ChannelHandlerContext ctx, ChannelPromise promise) throws java.lang.Exception
ChannelOutboundHandler
close
在界面
ChannelOutboundHandler
ctx
- 关闭操作的ChannelHandlerContext
promise
- 在操作完成后通知ChannelPromise
java.lang.Exception
- 发生错误时抛出
public void read(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelOutboundHandler
复制的描述
read
接口
ChannelOutboundHandler
java.lang.Exception
public void write(ChannelHandlerContext ctx, java.lang.Object msg, ChannelPromise promise) throws java.lang.Exception
ChannelOutboundHandler
复制的描述
write
在界面
ChannelOutboundHandler
ctx
- 写入操作的ChannelHandlerContext
msg
- 写信息
promise
- 在操作完成后通知ChannelPromise
java.lang.Exception
- 发生错误时抛出
public void flush(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelOutboundHandler
flush
在界面
ChannelOutboundHandler
ctx
- 进行冲洗操作的ChannelHandlerContext
java.lang.Exception
- 发生错误时抛出
public void channelInactive(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelInactive()
转发到ChannelPipeline
中的下一个ChannelInboundHandler
。
子类可以重写此方法来更改行为。
channelInactive
在界面
ChannelInboundHandler
channelInactive
在课堂上
ByteToMessageDecoder
java.lang.Exception
public void exceptionCaught(ChannelHandlerContext ctx, java.lang.Throwable cause) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireExceptionCaught(Throwable)
转发到ChannelPipeline
中的下一个ChannelHandler
。
子类可以重写此方法来更改行为。
exceptionCaught
接口
ChannelHandler
exceptionCaught
,界面
ChannelInboundHandler
exceptionCaught
在课堂上
ChannelInboundHandlerAdapter
java.lang.Exception
public static boolean isEncrypted(ByteBuf buffer)
ByteBuf
已加密,则返回true
。
请注意,此方法不会增加给定ByteBuf
的readerIndex 。
protected void decode(ChannelHandlerContext ctx, ByteBuf in, java.util.List<java.lang.Object> out) throws javax.net.ssl.SSLException
ByteToMessageDecoder
decode
在课堂
ByteToMessageDecoder
ctx
- ByteToMessageDecoder
所属的ChannelHandlerContext
in
- 从中读取数据的ByteBuf
out
- 应该添加解码消息的
List
javax.net.ssl.SSLException
public void channelReadComplete(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelInboundHandlerAdapter
ChannelHandlerContext.fireChannelReadComplete()
转发到ChannelPipeline
中的下一个ChannelInboundHandler
。
子类可以重写此方法来更改行为。
channelReadComplete
在界面
ChannelInboundHandler
channelReadComplete
在课堂上
ByteToMessageDecoder
java.lang.Exception
public void handlerAdded(ChannelHandlerContext ctx) throws java.lang.Exception
ChannelHandlerAdapter
handlerAdded
在界面
ChannelHandler
handlerAdded
在课堂上
ChannelHandlerAdapter
java.lang.Exception
public void channelActive(ChannelHandlerContext ctx) throws java.lang.Exception
channelActive
,界面
ChannelInboundHandler
channelActive
在课堂上
ChannelInboundHandlerAdapter
java.lang.Exception
Copyright © 2008–2018 The Netty Project. All rights reserved.