public abstract class SSLEngine extends Object
安全通信模式包括:
使用的加密套件是建立了一种协商的过程称为“握手”。这个过程的目标是创建或加入一个“会话”,这可能会让许多连接时间。握手完成后,您可以通过使用getSession()
方法访问会话属性。
的SSLSocket
类提供了许多相同的安全功能,但所有的入站和出站数据自动传输使用基础Socket
,通过设计采用分块模型。虽然这是适当的许多应用程序,该模型不提供大型服务器所需的可扩展性。
一个SSLEngine
的主要区别是它在入境和出境的字节流,独立的运输机制。是的SSLEngine
用户责任安排可靠的I/O传输到对等。从I/O传输机制分离的SSL / TLS的SSLEngine
抽象,可用于各种各样的I / O型,如non-blocking I/O (polling)
,selectable non-blocking I/O
,Socket
和传统输入/ OutputStreams,当地ByteBuffers
或字节数组, future asynchronous I/O models ,等等。
在一个较高的水平,出现这样的SSLEngine
:
应用程序数据| ^| | |V | |+——+ ----- | ----- +——+| | || SSL |发动机|wrap() | | | unwrap()|出境入境| || | |+——+ ----- | ----- +——+| | ^| | |V |NET数据应用数据(也被称为明文或明文)是产生或消耗由一个应用程序的数据。其对应的是网络数据,其中包括无论是握手和/或密文(加密)的数据,并注定要通过I/O机制运。入站数据是已从对等体接收的数据,和出站数据是注定的对等体的。
(在一个SSLEngine
,语境下的“握手”数据是指任何数据交换的建立和控制一个安全连接。握手数据包括SSL / TLS消息“警报”,“change_cipher_spec,”和“握手”。)
有一个SSLEngine
明显的五个阶段。
SSLEngine
已经创建并初始化,但尚未使用。在这个阶段,应用程序可以设置任何SSLEngine
-specific设置(启用密码套件,是否SSLEngine
应该在客户端或服务器模式、握手等)。一次握手开始,但是,任何新的设置(除了客户端/服务器模式,见下文)将用于下一次握手。SSLEngine
可以应用数据。出站应用程序消息进行加密和完整性保护,并将入站消息反向过程。SSLEngine
配置设置将不会被使用到下一次握手。SSLEngine
应该发送/接收任何剩余的消息给同伴在底层传输机制关闭。当发动机关闭时,它是不可重用:一个新的SSLEngine
必须创建。SSLEngine
是由一个初始化的
SSLContext
调用
SSLContext.createSSLEngine()
创建。任何配置参数被设置在
wrap()
,
unwrap()
制作的第一个电话,或
beginHandshake()
。这些方法都触发初始握手。
数据通过引擎通过调用wrap()
或unwrap()
出境或入境数据,分别。根据不同的SSLEngine
状态,一wrap()
呼叫可以使用应用程序数据源和目标缓冲区缓冲区可能产生网络数据。出站数据可能包含应用程序和/或握手数据。一个叫unwrap()
将检查源缓冲区和可能提前握手如果数据握手信息,或将应用程序数据在目的地缓冲如果数据中的应用。国家的底层SSL / TLS算法确定数据时,消费和生产。
电话wrap()
和unwrap()
返回一个SSLEngineResult
显示操作的状态,和(可选的)如何与引擎交互进步。
的SSLEngine
生产/消费的完整的SSL / TLS数据包,而不在内部调用之间wrap()/unwrap()
存储应用程序数据。因此,输入和输出ByteBuffer
s尺寸必须适当,可以产生的最大记录。电话SSLSession.getPacketBufferSize()
和SSLSession.getApplicationBufferSize()
应该用来确定适当的缓冲区大小。出站应用程序数据缓冲区的大小一般不重要。如果缓冲区的条件不允许对数据的正确消费/生产,应用程序必须确定(通过SSLEngineResult
)和纠正问题,然后尝试再次打电话。
例如,如果unwrap()
发动机决定了没有足够的可用空间SSLEngineResult.Status.BUFFER_OVERFLOW
目标缓冲区返回一个结果。应用程序应该调用SSLSession.getApplicationBufferSize()
和比较值与目标缓冲区的可用空间,如果有必要扩大缓冲区。同样,如果unwrap()
都返回一个SSLEngineResult.Status.BUFFER_UNDERFLOW
,应用程序应该调用SSLSession.getPacketBufferSize()
确保源缓冲区有足够的空间容纳一个记录(如果有必要的话,再扩大)获得更多的入站数据。
SSLEngineResult r = engine.unwrap(src, dst);
switch (r.getStatus()) {
BUFFER_OVERFLOW:
// Could attempt to drain the dst buffer of any already obtained
// data, but we'll just increase it to the size needed.
int appSize = engine.getSession().getApplicationBufferSize();
ByteBuffer b = ByteBuffer.allocate(appSize + dst.position());
dst.flip();
b.put(dst);
dst = b;
// retry the operation.
break;
BUFFER_UNDERFLOW:
int netSize = engine.getSession().getPacketBufferSize();
// Resize buffer if needed.
if (netSize > dst.capacity()) {
ByteBuffer b = ByteBuffer.allocate(netSize);
src.flip();
b.put(src);
src = b;
}
// Obtain more inbound network data for src,
// then retry the operation.
break;
// other cases: CLOSED, OK.
}
不像SSLSocket
,所有的方法都是非阻塞的sslengine。SSLEngine
实现可能需要完成的任务,可以采取长时间的结果,甚至可能阻碍。例如,一个trustmanager可能需要连接到一个远程的证书验证服务,或keymanager可能需要提示用户确定要使用的证书作为客户端认证的一部分。此外,创建加密签名和验证它们可以是缓慢的,似乎是阻塞的。
这可能有潜在的SSLEngine
块操作,将创建一个Runnable
委派的任务。当SSLEngineResult
表明委托任务的结果是必要的,应用程序必须调用getDelegatedTask()
获得杰出的委派的任务并调用它的run()
方法(可能使用一个不同的线程根据计算策略)。应用程序应该继续获得委派的任务,直到不存在,然后再试一次原始操作。
在通信会话结束时,应用程序应该正确关闭SSL / TLS链接。SSL / TLS协议关闭握手消息,这些消息要传达给同伴之前释放SSLEngine
和底层传输机制关闭。一个亲密的可以由一个开始:一个sslexception,入站关闭握手消息,或一个封闭的方法。在所有的情况下,关闭握手消息由发动机产生的,和wrap()
应反复直到产生SSLEngineResult
的返回状态“封闭”,或isOutboundDone()
返回true。所有获得的数据从wrap()
方法应送交同行。
closeOutbound()
用于信号的引擎,应用程序不会发送任何数据。
一个对等体将通过发送自己关闭的握手消息来表示其关闭的意图。该消息后已收到并由当地SSLEngine
的unwrap()
呼叫处理,应用程序可以通过调用unwrap()
和寻找一个SSLEngineResult
状态为“关闭”检测关闭,或者如果isInboundDone()
返回true。如果由于某种原因,同行关闭通信链路没有发送正确的SSL / TLS关闭消息,应用程序可以检测流端和信号通过closeInbound()
发动机,将没有更多的入站消息的处理。一些应用程序可能会选择需要一个对等的有序关闭消息,在这种情况下,他们可以检查关闭是由一个握手消息产生,而不是由流条件的结束。
有两组密码套件,你需要知道什么时候管理密码套件:
getSupportedCipherSuites()
。setEnabledCipherSuites(String [])
方法,并利用getEnabledCipherSuites()
方法查询。最初,一个默认的密码组设置将启用一个新的引擎,表示最低建议配置。每个SSL / TLS连接必须有一个客户端和一个服务器,因此每个端点必须决定哪些角色承担。这个选择决定谁开始的握手过程以及哪些类型的消息应该由每一方发送。方法setUseClientMode(boolean)
配置模式。一旦最初的握手开始,一个SSLEngine
不能客户端和服务器模式之间切换,即便进行重新谈判。
应用程序可能选择在不同线程中处理委派的任务。当一个SSLEngine
创建,保存当前AccessControlContext
。所有未来的委派任务将使用这种情况下处理:即,所有的访问控制决策将使用在引擎创建捕获的上下文。
wrap()
和unwrap()
方法可以并发执行的彼此。例如:
同步(outboundlock){sslengine。包(src,dst);outboundqueue放(DST);}作为一个推论,两个线程不能尝试调用相同的方法(无论是
wrap()
或unwrap()
)同时,因为没有办法保证最终的分组排序。SSLContext
,
SSLSocket
,
SSLServerSocket
,
SSLSession
,
Socket
Modifier | Constructor and Description |
---|---|
protected |
SSLEngine()
一个
SSLEngine 用于内部会话重用策略提供任何暗示的构造函数。
|
protected |
SSLEngine(String peerHost, int peerPort)
一个
SSLEngine 构造函数。
|
Modifier and Type | Method and Description |
---|---|
abstract void |
beginHandshake()
发起握手(初始或重新谈判,这sslengine)。
|
abstract void |
closeInbound()
信号,没有更多的入站网络将数据发送到这个
SSLEngine 。
|
abstract void |
closeOutbound()
信号不再出境申请资料将被送到这
SSLEngine 。
|
abstract Runnable |
getDelegatedTask()
返回一个授权
Runnable 任务这
SSLEngine 。
|
abstract String[] |
getEnabledCipherSuites()
返回正在使用的这台发动机启用SSL加密套件名称。
|
abstract String[] |
getEnabledProtocols()
返回正在使用这
SSLEngine 协议版本的名字。
|
abstract boolean |
getEnableSessionCreation()
如果新的SSL会话可以通过这个引擎建立返回true。
|
SSLSession |
getHandshakeSession()
返回
SSLSession 是SSL / TLS握手期间建造的。
|
abstract SSLEngineResult.HandshakeStatus |
getHandshakeStatus()
返回当前的这一现状
SSLEngine 握手。
|
abstract boolean |
getNeedClientAuth()
如果发动机将要求客户端认证返回true。
|
String |
getPeerHost()
返回对等体的主机名。
|
int |
getPeerPort()
返回对等体的端口号。
|
abstract SSLSession |
getSession()
在这
SSLEngine 返回使用的
SSLSession 。
|
SSLParameters |
getSSLParameters()
返回此sslengine效果sslparameters。
|
abstract String[] |
getSupportedCipherSuites()
返回可在该引擎上启用的密码套件的名称。
|
abstract String[] |
getSupportedProtocols()
返回该协议可以使用这些
SSLEngine 的名字。
|
abstract boolean |
getUseClientMode()
如果发动机将使用客户端模式握手时返回真。
|
abstract boolean |
getWantClientAuth()
如果发动机将请求客户端认证返回true。
|
abstract boolean |
isInboundDone()
返回是否
unwrap(ByteBuffer, ByteBuffer) 将接受任何入站数据信息。
|
abstract boolean |
isOutboundDone()
返回是否会产生更多的
wrap(ByteBuffer, ByteBuffer) 出境数据信息。
|
abstract void |
setEnabledCipherSuites(String[] suites)
设置启用此引擎上使用的密码套件。
|
abstract void |
setEnabledProtocols(String[] protocols)
设置启用此引擎上使用的协议版本。
|
abstract void |
setEnableSessionCreation(boolean flag)
新的SSL会话控制是否可以通过该引擎的建立。
|
abstract void |
setNeedClientAuth(boolean need)
配置引擎要求客户端认证。
|
void |
setSSLParameters(SSLParameters params)
适用于sslparameters这个引擎。
|
abstract void |
setUseClientMode(boolean mode)
配置引擎使用客户端(或服务器)模式时,握手。
|
abstract void |
setWantClientAuth(boolean want)
配置引擎请求客户端认证。
|
SSLEngineResult |
unwrap(ByteBuffer src, ByteBuffer dst)
试图破解SSL / TLS网络数据转换成明文数据的缓冲区的应用。
|
SSLEngineResult |
unwrap(ByteBuffer src, ByteBuffer[] dsts)
试图破解SSL / TLS网络数据序列变成一个明文应用数据缓冲区。
|
abstract SSLEngineResult |
unwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length)
试图破解SSL / TLS网络数据转换成一个序列的明文数据缓冲区中的应用。
|
SSLEngineResult |
wrap(ByteBuffer[] srcs, ByteBuffer dst)
试图将明文字节序列中数据缓冲区的SSL / TLS网络数据。
|
abstract SSLEngineResult |
wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst)
试图将明文字节从序列数据缓冲区的SSL / TLS网络数据。
|
SSLEngineResult |
wrap(ByteBuffer src, ByteBuffer dst)
试图编码缓冲区应用数据的明文为SSL / TLS网络数据。
|
protected SSLEngine()
SSLEngine
用于内部会话重用策略提供任何暗示的构造函数。
protected SSLEngine(String peerHost, int peerPort)
SSLEngine
SSLEngine
实现可以使用peerHost
和peerPort
参数作为其内部会话重用策略提示。
一些密码套件(如Kerberos)需要远程主机信息。这个类的实现应该使用此构造函数使用Kerberos。
参数不是由SSLEngine
认证。
peerHost
-对等主机的名称
peerPort
-同行的端口号
SSLContext.createSSLEngine(String, int)
,
SSLSessionContext
public String getPeerHost()
请注意,该值没有被验证,不应该依赖。
public int getPeerPort()
请注意,该值没有被验证,不应该依赖。
public SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst) throws SSLException
此方法的调用与调用的方式完全相同的行为:
engine.wrap(new ByteBuffer [] { src }, 0, 1, dst);
src
-
ByteBuffer
含出境申请资料
dst
-
ByteBuffer
持有境外网络数据
SSLEngineResult
描述此操作的结果。
SSLEngine
中止数据处理中遇到的一个问题
SSLException
。看到关于引擎关闭的更多信息的类描述。
ReadOnlyBufferException
-如果
dst
缓冲区是只读的。
IllegalArgumentException
-如果
src
或
dst
是空的。
IllegalStateException
如果客户端/服务器模式尚未确定。
wrap(ByteBuffer [], int, int, ByteBuffer)
public SSLEngineResult wrap(ByteBuffer[] srcs, ByteBuffer dst) throws SSLException
此方法的调用与调用的方式完全相同的行为:
engine.wrap(srcs, 0, srcs.length, dst);
srcs
-含出境应用数据
ByteBuffers
数组
dst
-
ByteBuffer
持有境外网络数据
SSLEngineResult
描述此操作的结果。
SSLException
-一个问题而引起的
SSLEngine
中止数据处理中遇到的。看到关于引擎关闭的更多信息的类描述。
ReadOnlyBufferException
-如果
dst
缓冲区是只读的。
IllegalArgumentException
-如果
srcs
或
dst
是无效的,或者在
srcs
任何元素为null。
IllegalStateException
如果客户端/服务器模式尚未确定。
wrap(ByteBuffer [], int, int, ByteBuffer)
public abstract SSLEngineResult wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst) throws SSLException
GatheringByteChannel
,以及对后继行为的更多信息
GatheringByteChannel.write(ByteBuffer[], int, int)
。
根据SSLEngine的状态,这种方法可能会产生网络数据而不消耗任何应用程序数据(例如,它可能会产生握手数据。)
应用程序负责可靠地传输网络数据的节点,并确保数据的多个调用创建wrap()运以同样的顺序产生它。应用程序必须正确地同步多个对该方法的调用。
如果这SSLEngine
尚未开始其第一次握手,这个方法会自动开始握手。
这种方法会产生SSL / TLS的记录,并会消耗尽可能多的源数据的可能,但不会消耗超过其余每个缓冲区字节的总和。每个ByteBuffer
的位置被更新以反映数据消耗或产生量。限制保持不变。
底层的内存的srcs
和dst ByteBuffer
s必须不一样。
看到关于引擎关闭的更多信息的类描述。
srcs
-含出境应用数据
ByteBuffers
数组
offset
-在第一缓冲区字节进行检索缓冲数组的偏移;它必须是非负的且不大于
srcs.length
length
-缓冲区的最大数量被访问;它必须是非负的且不大于
srcs.length
-
offset
dst
-
ByteBuffer
持有境外网络数据
SSLEngineResult
描述此操作的结果。
SSLException
-一个问题而引起的
SSLEngine
中止数据处理中遇到的。看到关于引擎关闭的更多信息的类描述。
IndexOutOfBoundsException
-如果在
offset
和
length
参数的前提条件不成立。
ReadOnlyBufferException
-如果
dst
缓冲区是只读的。
IllegalArgumentException
-如果
srcs
或
dst
是无效的,或者在规定的
srcs
序列的任何元素是空的。
IllegalStateException
如果客户端/服务器模式尚未确定。
GatheringByteChannel
,
GatheringByteChannel.write( ByteBuffer[], int, int)
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst) throws SSLException
此方法的调用与调用的方式完全相同的行为:
engine.unwrap(src, new ByteBuffer [] { dst }, 0, 1);
src
-
ByteBuffer
含入站网络数据。
dst
-
ByteBuffer
持有入境申请资料。
SSLEngineResult
描述此操作的结果。
SSLException
-一个问题而引起的
SSLEngine
中止数据处理中遇到的。看到关于引擎关闭的更多信息的类描述。
ReadOnlyBufferException
-如果
dst
缓冲区是只读的。
IllegalArgumentException
-如果
src
或
dst
是空的。
IllegalStateException
如果客户端/服务器模式尚未确定。
unwrap(ByteBuffer, ByteBuffer [], int, int)
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts) throws SSLException
此方法的调用与调用的方式完全相同的行为:
engine.unwrap(src, dsts, 0, dsts.length);
src
-
ByteBuffer
含入站网络数据。
dsts
-
ByteBuffer
s持有入境申请数据数组。
SSLEngineResult
描述此操作的结果。
SSLException
-一个问题而引起的
SSLEngine
中止数据处理中遇到的。看到关于引擎关闭的更多信息的类描述。
ReadOnlyBufferException
-如果有任何的
dst
缓冲区是只读的。
IllegalArgumentException
-如果
src
或
dsts
是无效的,或者在
dsts
任何元素为null。
IllegalStateException
如果客户端/服务器模式尚未确定。
unwrap(ByteBuffer, ByteBuffer [], int, int)
public abstract SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length) throws SSLException
ScatteringByteChannel
对散射的更多信息,并为后续行为的更多信息
ScatteringByteChannel.read(ByteBuffer[], int, int)
。
根据SSLEngine的状态,这种方法可能没有产生任何应用数据网络消费数据(例如,它可能会消耗握手数据。)
应用程序负责可靠地获取网络数据从节点,并调用unwrap()对订单数据被接收。应用程序必须正确地同步多个对该方法的调用。
如果这SSLEngine
尚未开始其第一次握手,这个方法会自动开始握手。
该方法将尝试使用一个完整的SSL / TLS的网络数据包,但不会消耗超过字节中剩余的缓冲区的数目。每个ByteBuffer
的位置被更新以反映数据消耗或产生量。限制保持不变。
底层的内存的src
和dsts ByteBuffer
s必须不一样。
入站网络缓冲器可以被修改为这个调用的结果:因此,如果网络数据包需要一些次要的目的,在调用该方法之前,数据应该被复制。注:网络数据不被第二sslengine有用,因为每个sslengine含有独特的随机状态影响SSL / TLS消息。
看到关于引擎关闭的更多信息的类描述。
src
-
ByteBuffer
含入站网络数据。
dsts
-
ByteBuffer
s持有入境申请数据数组。
offset
-在第一缓冲区字节将缓冲数组的偏移;它必须是非负的且不大于
dsts.length
。
length
-缓冲区的最大数量被访问;它必须是非负的且不大于
dsts.length
-
offset
。
SSLEngineResult
描述此操作的结果。
SSLException
-一个问题而引起的
SSLEngine
中止数据处理中遇到的。看到关于引擎关闭的更多信息的类描述。
IndexOutOfBoundsException
-如果在
offset
和
length
参数的前提条件不成立。
ReadOnlyBufferException
-如果有任何的
dst
缓冲区是只读的。
IllegalArgumentException
-如果
src
或
dsts
是无效的,或者在规定的
dsts
序列的任何元素是空的。
IllegalStateException
如果客户端/服务器模式尚未确定。
ScatteringByteChannel
,
ScatteringByteChannel.read( ByteBuffer[], int, int)
public abstract Runnable getDelegatedTask()
Runnable
任务这
SSLEngine
。
SSLEngine
操作可能需要操作块的结果,也可能完全采取长时间。这种方法被用来获得一个优秀的Runnable
作业(任务)。每个任务必须被分配一个线程(或电流)进行run
操作。一旦run
方法返回的Runnable
对象不再需要和可能被丢弃。
委派任务运行到位时,这个对象被创建AccessControlContext
。
调用此方法将完全返回每一个优秀的任务一次。
多个委派任务可以并行运行。
Runnable
委派任务,或null,如果没有可用的。
public abstract void closeInbound() throws SSLException
SSLEngine
。
如果应用程序启动关闭过程调用closeOutbound()
,在某些情况下,它是不需要为同行的相应消息引发剂等。(见规范第7.2.1 TLS(RFC 2246)的更多信息,等待关闭警报。)在这种情况下,该方法不需要被称为。
但是,如果应用程序没有启动关闭进程,如果上述情况不适用,这种方法被称为每当端的SSL / TLS数据流达到。这保证了入境的侧封,并检查点之后的SSL / TLS的关闭程序,以检测可能的截断攻击。
这种方法是幂等:如果入境已关闭,此方法不做任何事。
wrap()
应该叫冲任何剩余的握手数据。
SSLException
-如果发动机没有得到适当的SSL / TLS关闭通知消息来自同伴。
isInboundDone()
,
isOutboundDone()
public abstract boolean isInboundDone()
unwrap(ByteBuffer, ByteBuffer)
将接受任何入站数据信息。
SSLEngine
不会消耗了网络数据(通过暗示,不会产生任何更多的应用程序数据。)
closeInbound()
public abstract void closeOutbound()
isOutboundDone()
public abstract boolean isOutboundDone()
wrap(ByteBuffer, ByteBuffer)
出境数据信息。
关闭期间,注意,一个SSLEngine
可能产生握手关闭数据必须发送到同伴。wrap()
必须生成这些数据。当此方法返回真实,没有更多的出站数据将被创建。
SSLEngine
不会产生任何更多的网络数据
closeOutbound()
,
closeInbound()
public abstract String[] getSupportedCipherSuites()
getEnabledCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract String[] getEnabledCipherSuites()
即使一个套件已启用,它可能永远不会被使用。(例如,对等体不支持它,所需的证书/私钥的套件是不可用的,或一个匿名的套件,但需要身份验证。)
getSupportedCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract void setEnabledCipherSuites(String[] suites)
在suites
参数每个密码套件必须已上市getsupportedciphersuites(),或方法会失败。继成功调用这个方法,只有在suites
参数上市套房都能使用。
看到getEnabledCipherSuites()
更多信息,为什么一个特定的密码套件可能永远不会被用在发动机。
suites
名称的所有密码套件使
IllegalArgumentException
-当一个或更多的密码由参数指定不支持,或者当参数为空。
getSupportedCipherSuites()
,
getEnabledCipherSuites()
public abstract String[] getSupportedProtocols()
SSLEngine
的名字。
public abstract String[] getEnabledProtocols()
SSLEngine
协议版本的名字。
setEnabledProtocols(String [])
public abstract void setEnabledProtocols(String[] protocols)
该协议必须被列为支持getsupportedprotocols()。继成功调用这个方法,只有在protocols
参数上市协议能使用。
protocols
名称的所有协议,使。
IllegalArgumentException
-当一个或更多的协议参数的命名是不支持或当协议参数为空。
getEnabledProtocols()
public abstract SSLSession getSession()
SSLEngine
返回使用的
SSLSession
。
这些可以是长寿命的,并且经常对应于某个用户的整个登录会话。会话指定了在该会话中的所有连接正在使用的一个特定的密码组,以及会话的客户端和服务器的身份。
不像SSLSocket.getSession()
此方法不会阻止直到握手完成。
直到第一次握手完成,此方法返回一个会话对象报告无效的密码套件“ssl_null_with_null_null”。
SSLEngine
的
SSLSession
SSLSession
public SSLSession getHandshakeSession()
SSLSession
是SSL / TLS握手期间建造的。
TLS协议可协商的参数,使用这个类的实例时所需要的,但在SSLSession
已经完全初始化,可以通过getSession
。例如,有效的签名算法的列表可能限制在trustmanager决定使用证书,类型,或最大TLS片段数据包大小可以调整到更好的支持网络环境。
这种方法提供了早期进入SSLSession
构造。根据握手取得的进展,一些数据可能还没有被使用。例如,如果一个远程服务器将发送一个证书链,但链尚未被处理,对SSLSession
的getPeerCertificates
方法将抛出一个sslpeerunverifiedexception。一旦链已被处理,getPeerCertificates
将返回正确的值。
SSLSession
目前正在协商。
UnsupportedOperationException
-如果基础提供程序不执行操作。
SSLSocket
,
SSLSession
,
ExtendedSSLSession
,
X509ExtendedKeyManager
,
X509ExtendedTrustManager
public abstract void beginHandshake() throws SSLException
此方法不需要初始握手,为wrap()
和unwrap()
方法将隐式调用此方法如果握手还没有开始。
请注意,同伴也可以要求重新谈判这SSLEngine
会议通过发送适当的会话协商握手消息。
不像SSLSocket#startHandshake()
方法,此方法不会阻止直到握手完成。
强迫一个完整的SSL / TLS会话协商当前会话应无效调用此方法之前。
有些协议不支持多个握手对现有引擎,并可能引发SSLException
。
SSLException
-如果在信号的
SSLEngine
开始一个新的握手中遇到的一个问题。看到关于引擎关闭的更多信息的类描述。
IllegalStateException
如果客户端/服务器模式尚未确定。
SSLSession.invalidate()
public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()
SSLEngine
握手。
SSLEngineResult.HandshakeStatus
。
public abstract void setUseClientMode(boolean mode)
这种方法必须在任何握手时称为。一次握手开始,模式不能对这台发动机的寿命复位。
服务器通常对自己进行身份验证,而客户端不需要这样做。
mode
-如果发动机要握手“客户端”模式
IllegalArgumentException
-如果一个模式的变化是试图在最初的握手开始。
getUseClientMode()
public abstract boolean getUseClientMode()
setUseClientMode(boolean)
public abstract void setNeedClientAuth(boolean need)
一个引擎的客户端身份验证设置是下列之一:
不像setWantClientAuth(boolean)
,如果设置了此选项,客户端不提供关于本身,认证信息谈判将停止,发动机将开始关闭程序。
调用此方法重写这个方法或setWantClientAuth(boolean)
做出任何以前的设置。
need
-设置为true,如果客户需要身份验证,或假如果没有客户端认证要求。
getNeedClientAuth()
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getNeedClientAuth()
setNeedClientAuth(boolean)
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract void setWantClientAuth(boolean want)
一个引擎的客户端身份验证设置是下列之一:
不像setNeedClientAuth(boolean)
,如果设置了此选项,客户端不提供自己的认证信息,谈判将继续。
调用此方法重写这个方法或setNeedClientAuth(boolean)
做出任何以前的设置。
want
-设置为true,如果要求客户端身份验证,或假如果没有客户端认证要求。
getWantClientAuth()
,
setNeedClientAuth(boolean)
,
getNeedClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getWantClientAuth()
setNeedClientAuth(boolean)
,
getNeedClientAuth()
,
setWantClientAuth(boolean)
,
setUseClientMode(boolean)
public abstract void setEnableSessionCreation(boolean flag)
flag
真表明会话可能被创造;这是默认的。错误表示必须恢复现有会话
getEnableSessionCreation()
public abstract boolean getEnableSessionCreation()
setEnableSessionCreation(boolean)
public SSLParameters getSSLParameters()
public void setSSLParameters(SSLParameters params)
这意味着:
params.getCipherSuites()
非空,setEnabledCipherSuites()
叫做价值。params.getProtocols()
非空,setEnabledProtocols()
叫做价值。params.getNeedClientAuth()
或params.getWantClientAuth()
返回true
,setNeedClientAuth(true)
和setWantClientAuth(true)
称,分别称为;否则setWantClientAuth(false)
。params.getServerNames()
非空,发动机将与价值配置的服务器名称。params.getSNIMatchers()
非空,发动机将与价值配置SNI的匹配。params
-参数
IllegalArgumentException
-如果setenabledciphersuites()或setenabledprotocols()调用失败
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.