SSLEngine 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。
[Android.Runtime.Register("javax/net/ssl/SSLEngine", DoNotGenerateAcw=true)]
public abstract class SSLEngine : Java.Lang.Object
[<Android.Runtime.Register("javax/net/ssl/SSLEngine", DoNotGenerateAcw=true)>]
type SSLEngine = class
inherit Object
- 继承
- 属性
注解
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性”等协议 (TLS) 协议实现安全通信的类,但独立于传输。
安全通信模式包括: <UL>
<LI><em>完整性保护</em>. SSL/TLS 可防止活动线路应用修改消息。
<LI><em>Authentication</em>. 在大多数模式下,SSL/TLS 提供对等身份验证。 服务器通常经过身份验证,客户端可以根据服务器的请求进行身份验证。
<LI><em>Confidentiality (Privacy Protection) </em>. 在大多数模式下,SSL/TLS 会加密在客户端和服务器之间发送的数据。 这可以保护数据的机密性,使被动窃讯者不会看到敏感数据,例如财务信息或多种个人信息。
</Ul>
这些类型的保护由“密码套件”指定,该套件是给定 SSL 连接使用的加密算法的组合。 在协商过程中,两个终结点必须就两个环境中可用的密码套件达成一致。 如果没有这种共同套件,则无法建立 SSL 连接,并且无法交换数据。
所使用的密码套件是通过称为“握手”的协商过程建立的。 此过程的目标是创建或重新加入“会话”,这可能会随着时间的推移保护许多连接。 握手完成后,可以使用 方法访问会话属性 #getSession()
。
类 SSLSocket
提供许多相同的安全功能,但所有入站和出站数据都是使用基础 java.net.Socket Socket
自动传输的,根据设计,该基础使用阻止模型。 虽然这适用于许多应用程序,但此模型不提供大型服务器所需的可伸缩性。
的主要区别 SSLEngine
在于它在入站和出站字节流上运行,独立于传输机制。 用户负责 SSLEngine
安排到对等节点的可靠 I/O 传输。 通过将 SSL/TLS 抽象与 I/O 传输机制分开,SSLEngine
可用于各种 I/O 类型,例如 java.nio.channels.spi.AbstractSelectableChannel#configureBlocking(boolean) non-blocking I/O (polling)
、 java.nio.channels.Selector selectable non-blocking I/O
java.net.Socket Socket
和传统的 Input/OutputStreams、本地java.nio.ByteBuffer ByteBuffers
或字节数组、未来的异步 I/O 模型等。
概括而言, SSLEngine
如下所示:
app data
| ^
| | |
v | |
+----+-----|-----+----+
| | |
| SSL|Engine |
wrap() | | | unwrap()
| OUTBOUND | INBOUND |
| | |
+----+-----|-----+----+
| | ^
| | |
v |
net data
应用程序数据 (也称为纯文本或明文) 是由应用程序生成或使用的数据。 其对应数据是网络数据,它由握手和/或加密文本 (加密) 数据组成,并注定要通过 I/O 机制传输。 入站数据是从对等方接收的数据,而出站数据则发往对等方。
(在 上下文 SSLEngine
中,术语“握手数据”是指为建立和控制安全连接而交换的任何数据。握手数据包括 SSL/TLS 消息“警报”、“change_cipher_spec”和“握手”。)
有五个不同的 SSLEngine
阶段。
<OL><li> 创建 - SSLEngine
已创建并初始化,但尚未使用。 在此阶段,应用程序可以设置任何 SSLEngine
-specific 设置 (启用的密码套件,是否 SSLEngine
应在客户端或服务器模式下握手,等等) 。 不过,开始握手后,除客户端/服务器模式之外的任何新设置 (,请参阅下面的) 将用于下一次握手。
<li> 初始握手 - 初始握手是两个对等方交换通信参数,直到建立 SSLSession 的过程。 在此阶段无法发送应用程序数据。
<li> 应用程序数据 - 建立通信参数并完成握手后,应用程序数据可能会流经 SSLEngine
。 出站应用程序消息经过加密和完整性保护,入站消息会反转进程。
<li> Rehandshaking - 在应用程序数据阶段,任一方可能随时请求重新协商会话。 新的握手数据可以在应用程序数据之间混合。 在开始重新调整阶段之前,应用程序可能会重置 SSL/TLS 通信参数,例如已启用的密码套件列表以及是否使用客户端身份验证,但无法在客户端/服务器模式之间更改。 与以前一样,一旦开始握手,下一次握手之前不会使用任何新的 SSLEngine
配置设置。
<li> 关闭 - 当不再需要连接时,应用程序应关闭 SSLEngine
,并在关闭基础传输机制之前向对等方发送/接收任何剩余消息。 关闭引擎后,它不可重复使用:必须创建一个新的 SSLEngine
。 </OL> 通过SSLEngine
从初始化SSLContext
的 调用SSLContext#createSSLEngine()
来创建。 应在首次调用 wrap()
、 unwrap()
或 beginHandshake()
之前设置任何配置参数。 这些方法都会触发初始握手。
数据通过调用 #wrap(ByteBuffer, ByteBuffer) wrap()
或 分别通过出站或 #unwrap(ByteBuffer, ByteBuffer) unwrap()
入站数据在引擎中移动。 根据 的状态 SSLEngine
, wrap()
调用可能会使用源缓冲区中的应用程序数据,并可能在目标缓冲区中生成网络数据。 出站数据可能包含应用程序和/或握手数据。 调用 将 unwrap()
检查源缓冲区,如果数据是握手信息,则可能会推进握手;如果数据是应用程序,则可能会将应用程序数据置于目标缓冲区中。 基础 SSL/TLS 算法的状态将确定何时使用和生成数据。
wrap()
调用 并unwrap()
返回指示SSLEngineResult
操作状态的 , (可以选择) 如何与引擎交互以取得进展。
仅 SSLEngine
生成/使用完整的 SSL/TLS 数据包,并且不会在对 的调用 wrap()/unwrap()
之间在内部存储应用程序数据。 ByteBuffer
因此,输入和输出必须适当调整大小,以容纳可以生成的最大记录。 SSLSession#getPacketBufferSize()
对 和 SSLSession#getApplicationBufferSize()
的调用应用于确定适当的缓冲区大小。 出站应用程序数据缓冲区的大小通常并不重要。 如果缓冲区条件不允许正确使用/生成数据,则应用程序必须通过 SSLEngineResult
) 确定 (并更正问题,然后重试调用。
例如, unwrap()
如果引擎确定没有足够的可用目标缓冲区空间,将返回 SSLEngineResult.Status#BUFFER_OVERFLOW
结果。 应用程序应调用 SSLSession#getApplicationBufferSize()
该值并将其与目标缓冲区中的可用空间进行比较,并在必要时扩大缓冲区。 同样,如果要 unwrap()
返回 , SSLEngineResult.Status#BUFFER_UNDERFLOW
则应用程序应调用 SSLSession#getPacketBufferSize()
以确保源缓冲区有足够的空间来保存记录 (在必要时放大) ,然后获取更多入站数据。
{@code
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
将创建委托 java.lang.Runnable
任务。 当指示需要委托任务结果时 SSLEngineResult
,应用程序必须调用 #getDelegatedTask()
以获取未完成的委托任务,并调用其 java.lang.Runnable#run() run()
方法 (可能使用不同的线程,具体取决于计算策略) 。 应用程序应继续获取委托任务,直到不再存在,然后再次尝试原始操作。
在通信会话结束时,应用程序应正确关闭 SSL/TLS 链接。 SSL/TLS 协议具有关闭握手消息,在释放 SSLEngine
并关闭基础传输机制之前,应将这些消息传达给对等方。 关闭可以通过以下方法之一启动:SSLException、入站关闭握手消息或关闭方法之一。 在所有情况下,关闭握手消息都由引擎生成, wrap()
应重复调用,直到结果 SSLEngineResult
的状态返回“已关闭”或 #isOutboundDone()
返回 true。 从 wrap()
方法获取的所有数据都应发送到对等方。
#closeOutbound()
用于向引擎发出信号,指出应用程序不会再发送任何数据。
对等方将通过发送自己的关闭握手消息来发出关闭意向的信号。 本地SSLEngine
unwrap()
调用收到并处理此消息后,应用程序可以通过调用unwrap()
并查找SSLEngineResult
状态为“已关闭”的 ,或者如果#isInboundDone()
返回 true,来检测关闭。 如果由于某种原因,对等方在未发送正确的 SSL/TLS 关闭消息的情况下关闭通信链接,则应用程序可以检测流结束,并通过该信号向引擎 #closeInbound()
发出信号,以便不再有要处理的入站消息。 某些应用程序可能会选择要求从对等方有序关闭消息,在这种情况下,它们可以检查关闭是由握手消息生成的,而不是由流结束条件生成的。
管理密码套件时需要了解两组密码套件:
<UL><LI><em>支持</密码> 套件:SSL 实现支持的所有套件。 使用 报告 #getSupportedCipherSuites()
此列表。
<LI><em>Enabled</em> 密码套件,可能少于完整的受支持套件集。 此组使用 #setEnabledCipherSuites(String [])
方法设置,并使用 #getEnabledCipherSuites()
方法进行查询。 最初,将在表示建议的最低配置的新引擎上启用一组默认密码套件。 </Ul>
实现默认值要求默认情况下仅启用对服务器进行身份验证并提供机密性的密码套件。 仅当双方明确同意未经身份验证和/或非专用 (未加密) 通信时,才会选择此类密码套件。
每个 SSL/TLS 连接必须有一个客户端和一个服务器,因此每个终结点必须决定要承担哪个角色。 此选项确定谁开始握手过程,以及每一方应发送哪些类型的消息。 方法 #setUseClientMode(boolean)
配置 模式。 开始初始握手后,即使执行重新协商, SSLEngine
也无法在客户端和服务器模式之间切换。
应用程序可能会选择处理不同线程中的委托任务。 SSLEngine
创建 时,将保存当前 java.security.AccessControlContext
。 将来的所有委托任务都将使用此上下文进行处理:也就是说,所有访问控制决策都将使用创建引擎时捕获的上下文进行。
<人力资源>
<B>并发说明</B>:需要注意两个并发问题:
<OL><li>和 wrap()
unwrap()
方法可以同时彼此执行。
<li> SSL/TLS 协议采用有序数据包。 应用程序必须小心确保生成的数据包按顺序传递。 如果数据包无序到达,可能会出现意外或致命的结果。
例如:
synchronized (outboundLock) {
sslEngine.wrap(src, dst);
outboundQueue.put(dst);
}
作为必然结果,两个线程不得尝试同时 (wrap()
或 unwrap()
) 调用相同的方法,因为无法保证最终的数据包排序。 </老>
<h3>不同 Android 版本<的默认配置/h3>
SSLEngine
从默认值 SSLContext
获取的实例配置如下:
<style type=“text/css”> tr.deprecated { background-color: #ccc; color: #999; font-style: italic; }</风格>
<h4>Protocol</h4><table><thead><tr th>><Protocol</th>><supported (API levels) </th>><默认启用 (API 级别) </th></tr<>/thead<>tbody><tr class=“deprecated”<>td>SSLv3</td><td>1–25</td><td>1–22</td<>/tr<>td><>TLSv1</td><td>1+</td<>td>1+</td></tr><td<>>TLSv1.1</td<>td>20+</td><td>20+</td<>/tr<<>>td>TLSv1.2</td<>td>20+</td<>td>20+</td<>/tr<>><td>TLSv1.3</Td><td>29+</td<>td>29+</td></tr<>/tbody></table>
<h4>密码套件</h4><表><thead><tr><th>Cipher suite</th><>支持 (API 级别) </th><>默认启用 (API 级别) </th<>/tr></thead><tbody<>tr class=“deprecated”><td>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</td<>td>9-22</td><td>9-19</td></tr><tr class=“deprecated”><td>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</td<>td>9-22</td<>td>9-19</td></tr><class=“deprecated”<>td>SSL_DHE_DSS_WITH_DES_CBC_SHA</td<>td>9-22</td<>td td>9-19</td<>/tr<>class=“deprecated”<>td>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</td><td>9-22</td<>td>9-19</td<>/tr<>class=“deprecated”><td>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td td>><9-22</td<>td>9-19</td></tr><class=“deprecated”><td>SSL_DHE_RSA_WITH_DES_CBC_SHA</td td>><9-22</td<>td>9-19</td></tr><tr class=“deprecated”><td>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</td<>td>9-22</td><td td></td></tr<>class=“deprecated”<>td>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</td<>td>9-22</td><td/td<>></tr<>class=“deprecated”<>td>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</td><td>9-22</Td><td></td></tr><tr class=“deprecated”><td>SSL_DH_anon_WITH_DES_CBC_SHA</td<>td>9-22</td<>td></td></tr<>class=“deprecated”<>td>SSL_DH_anon_WITH_RC4_128_MD5</td<>td>9-22</td><td/td><></tr<>class=“deprecated”><td SSL_RSA_EXPORT_><WITH_DES40_CBC_SHA/td<>td>9-22</td><td>9-19</td<>/tr<>class=“deprecated”<>td>SSL_RSA_EXPORT_WITH_RC4_40_MD5</td><td>9-22</td<>td td>9-19</td></tr><><td>SSL_RSA_WITH_3DES_EDE_CBC_SHA</td><td>9+</td><td>9-19</Td></tr>class=“deprecated”<>td>SSL_RSA_WITH_DES_CBC_SHA</td td><>9-22</td<>td>9-19</td<>/tr<>class=“deprecated”><td>SSL_RSA_WITH_NULL_MD5</td><td>9-22</td<>td/td><<>/tr><class=“deprecated”<>td>SSL_RSA_WITH_NULL_SHA</td><<td>9-22</td><td></td<>/tr><class=“deprecated”<>td>SSL_RSA_WITH_RC4_128_MD5</td><td>9-25</td<>td>9-19</td></tr><class=“deprecated”><td>SSL_RSA_WITH_RC4_128_SHA</td<>td>9-25</td<>td>9-23</td></tr><Tr><td>TLS_AES_128_GCM_SHA256</td><td>29+</td><td>29+</td></tr>><<td>TLS_AES_256_GCM_SHA384</td td<>>29+</td><td>29+</td></tr<<>>td>TLS_CHACHA20_POLY1305_SHA256</td td>><29+</td><td>29+</td></Tr><tr class=“deprecated”>td>TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</td<>td>1-8</td<>td>1-8</td></tr><class=“deprecated”<>td>TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA</td<>td>1-8</td><td>1-8</td<>/tr<>tr class=“deprecated”><td TLS_DHE_DSS_WITH_AES_128_><<CBC_SHA/td<>td>9-22</td><td>9-22</td></tr><class=“deprecated”><td>TLS_DHE_DSS_WITH_AES_128_CBC_SHA256</td><td>20-22</td td></td>< td><>< class=“deprecated”<>td>TLS_DHE_DSS_WITH_AES_128_GCM_SHA256</td><td>20-22</td td><td></Td></tr><class=“deprecated”<>td>TLS_DHE_DSS_WITH_AES_256_CBC_SHA</td td<>>9-22</td<>td>20-22</td></tr<>class=“deprecated”<>td>TLS_DHE_DSS_WITH_AES_256_CBC_SHA256</td<>td>20-22</td><td/td><></tr<>class=“deprecated”><td TLS_DHE_DSS_WITH_><AES_256_GCM_SHA384/td<>td>20-22</td td<>td></td></tr<>class=“deprecated”><td>TLS_DHE_DSS_WITH_DES_CBC_SHA</td<>td>1-8</td><td>1-8</td></tr><tr class=“deprecated”<>td>TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</td><td>1-8</td td><>1-8</td></tr<>class=“deprecated”><td>TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td><td>1-8</td<>td>1-8</td<>/tr<>class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_128_CBC_SHA</td<>td>9-25</td td><>9-25</td<>/tr><class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_128_CBC_SHA256</td<>td>20-25</td<>td/td><></tr<>class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_128_GCM_SHA256</td><td>20-25</td><td>20-25</td<>/tr<>class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_256_CBC_SHA</td><td>9-25</td<>td>20-25</td></tr<>class=“deprecated”<>td>TLS_DHE_RSA_WITH_AES_256_CBC_SHA256</td><td>20-25</td<>td></td<>>< class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_256_GCM_SHA384</td><td>20-25</td<>td>20-25</td></tr><class=“deprecated”<>td>TLS_DHE_RSA_WITH_DES_CBC_SHA</td<>td>1-8</td<>td>1-8</td<>/tr<>tr class=“deprecated”<>td>TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA</td<>td>1-8</td><td></td<>/tr<>class=“deprecated”><td>TLS_DH_DSS_<WITH_3DES_EDE_CBC_SHA/td<>td>1-8</td td></td><></tr><class=“deprecated”><td>TLS_DH_DSS_WITH_DES_CBC_SHA</td<>td>1-8</td td<>/td<>>< td>< class=“deprecated”<>td>TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA</td<>td>1-8</td><td><></tr><class=“deprecated”<>td>TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA</td><td>1-8</td<>td></td></tr><class=“deprecated”<>td>TLS_DH_RSA_WITH_DES_CBC_SHA</td<>td>1-8</td<>td></<>tr<>class=“deprecated”><td TLS_DH_anon_EXPORT_WITH_><DES40_CBC_SHA/td><td>1-8</td td><<>/td></tr><class=“deprecated”<>td>TLS_DH_anon_WITH_3DES_EDE_CBC_SHA</td<>td>1-8</td td<>/td<>>< td>< class=“deprecated”><td>TLS_DH_anon_WITH_AES_128_CBC_SHA</td><td>9-22</td td><><></Tr><tr class=“deprecated”>td>TLS_DH_anon_WITH_AES_128_CBC_SHA256</td<>td>20-22</td<>td></td<>/tr<>class=“deprecated”<>td>TLS_DH_anon_WITH_AES_128_GCM_SHA256</td<>td>20-22</td td>><</td></tr<>class=“deprecated”><td>TLS_DH_anon_WITH_AES_256_CBC_SHA/<<td><td>9-22</td><td/td>><</tr><class=“deprecated”<>td>TLS_DH_anon_WITH_AES_256_CBC_SHA256</td<>td>20-22</td td></td<>></tr><class=“deprecated”<>td>TLS_DH_anon_WITH_AES_256_GCM_SHA384</td><td>20-22</td td<><>/tr><><tr class=“deprecated”><td>TLS_DH_anon_WITH_DES_CBC_SHA</td><td>1-8</td><td></td></tr><class=“deprecated”<>td>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td<>td></td<>/tr><<>td>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</td><td>20+</td><td>20+</td<>/tr<>class=“deprecated”<>td>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256</td><td>20-28</td td><></td><><>< td>TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256</td<>td td>20+</td><td>20+</td/><tr><tr><td>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA</td<>td>20+</td<>td>20+</td<>/tr<>tr class=“deprecated”><td>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384</td<>td>20-28</td<>td></td></tr>><<td>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384/<td><td>20+</td><td>20+</td<>/tr<><>td>TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256</td td<>>24+</td><td>24+</td<>/tr><class=“deprecated”<>td>TLS_ECDHE_ECDSA_WITH_NULL_SHA</td<>td>20-22</td><td/><td></tr><class=“deprecated”<>td>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</td><td>20-25</td><td>20-23</td<>/tr>><<td>TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA</td td<>>21+</td><td>21+</td<>/tr><><Td><TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA/td><td>21+</td td><>21+</td></tr>><<td>TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256</td<>td>24+</td><td>24+</td<>/tr<>tr class=“deprecated”<>td>TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td><td/td><></tr><<>td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</td<>td>20+</td<>td>20+</td></tr><class=“deprecated”<>td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</td><td>20-28</td><td td></Td></tr>><<td>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</td<>td>20+</td<>td>20+</td<>/tr<>><td>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</td<>td>20+</td td>><20+</td></tr<>class=“deprecated”><td TLS_><ECDHE_RSA_WITH_AES_256_CBC_SHA384/td<>td>20-28</td><td></td<>/tr><<>td>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</td<>td>20+</td<>td>20+</td<>/tr><td><>TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256</td td><>24+</td<>td>24+</td<>/tr><class=“deprecated”><td>TLS_ECDHE_RSA_WITH_NULL_SHA</td><td>20-22</td td<>td></td></tr><class=“deprecated”><td>TLS_ECDHE_RSA_WITH_RC4_128_SHA</td><td>20-25</td<>td>20-23</td></tr><class=“deprecated”<>td>TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td><td/td><></tr><class=“deprecated”<>td>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA</td><td>20-22</td td<>/td><></tr><class=”deprecated“><td>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256</td><td>20-22</td><td></td<>/tr><class=”deprecated“<>td>TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256</td<>td>20-22</td td>><</td></tr<>class=”deprecated“><td TLS_ECDH_><ECDSA_WITH_AES_256_CBC_SHA/td<>td>20-22</td<>td/td<>></tr><class=“deprecated”><td>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384</td><td>20-22</td><td/td<>></tr<>class=“deprecated”><td>TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384</td><td>20-22</td<>td></td></tr><class=“deprecated”><td>TLS_ECDH_ECDSA_WITH_NULL_SHA</td><td>20-22</td><td></td></tr><class=“deprecated”<>td>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</td<>td>20-22</td td><><></tr><class=“deprecated”<>td>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td<>td></td></tr<>class=“deprecated”<>td>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA</td><td>20-22</td<>td/td><></tr><class=“deprecated”><td>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256</td<>td>20-22</td<>td/td><></tr<>class=“deprecated”><td>TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256</td<>td>20-22</td><td></td></tr<>class=“deprecated”><td TLS_ECDH_RSA_WITH_AES_256_><CBC_SHA/td<>td>20-22</td td<>td></td<>/tr><class=“deprecated”<>td>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384</td<>td>20-22</td><td/td<>></tr<>class=“deprecated”<>td>TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384</td><td>20-22</Td><td></td></tr><class=“deprecated”<>td>TLS_ECDH_RSA_WITH_NULL_SHA</td<>td>20-22</td td><></td></tr><class=“deprecated”<>td>TLS_ECDH_RSA_WITH_RC4_128_SHA</td><td>20-22</td td<>/td><></tr><class=“deprecated”><td>TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</td<>td>20-22</td<>td/td><></tr<>class=“deprecated”><td>TLS_ECDH_anon_WITH_AES_128_CBC_SHA</td<>td>20-22</td><td></td></tr<>class=“deprecated”><td TLS_ECDH_anon_WITH_AES_256_><CBC_SHA/td><td>20-22</td td><></td<>/tr<>class=“deprecated”<>td>TLS_ECDH_anon_WITH_NULL_SHA</td<>td>20-22</td><td></td></tr<>class=“deprecated”><td>TLS_ECDH_anon_WITH_RC4_128_SHA</td<>td>20-22</td><td></td></tr><<>td>TLS_EMPTY_RENEGOTIATION_INFO_SCSV</td><td>20+</td><td>20+</td></tr><><td>TLS_FALLBACK_SCSV</td<>td>21+</td><td/td<>></tr<>class=“deprecated”><td><TLS_NULL_WITH_NULL_NULL/td><td>1-8</td td><></td<>/tr<>class=“deprecated”><td>TLS_PSK_WITH_3DES_EDE_CBC_SHA</td<>td>21-22</td<>td></td<><<>>> TLS_PSK_WITH_AES_128_CBC_SHA</td<>td>21+</td><td>21+</td<>/tr>><<td>TLS_PSK_WITH_AES_256_CBC_SHA</td><td>21+</td><td>21+</td></tr<>class=“deprecated”<>td>TLS_PSK_WITH_RC4_128_SHA</td<>td>21-25</td td>><</td<>/tr><class=“deprecated”>td>TLS_RSA_EXPORT_WITH_DES40_CBC_SHA</td><td>1-8</td<>td>1-8</td<>/tr><class=“deprecated”><td>TLS_RSA_WITH_3DES_EDE_CBC_SHA</td<>td>1-8</td<>td>1-8</td></tr<>><td>TLS_RSA_WITH_AES_<<128_CBC_SHA/td<>td>9+</td td<>>9+</td<>/tr<>class=“deprecated”><td>TLS_RSA_WITH_AES_128_CBC_SHA256</td><td>20-28</td<>td></td>>><<>< TLS_RSA_WITH_AES_128_GCM_SHA256</td><td>20+</td><td>20+</td<>/tr>><<td>TLS_RSA_WITH_AES_256_CBC_SHA</td><td>9+</td><td>20+</td></tr><class=“deprecated”<>td>TLS_RSA_WITH_AES_256_CBC_SHA256</td><td>20-28</td<>td/td><></tr><><td>TLS_RSA_WITH_AES_256_GCM_SHA384</td<>td>20+</td<>td>20+</td<>/tr><tr class=“deprecated”<>td>TLS_RSA_WITH_DES_CBC_SHA</td<>td>1-8</td<>td>1-8</td<>/tr<>class=“deprecated”><td>TLS_RSA_WITH_NULL_MD5</Td><td>1-8</td<>td></td></tr<>class=“deprecated”><td>TLS_RSA_WITH_NULL_SHA</td><td>1-8</td td<>td></td></tr<>class=“deprecated”><td>TLS_RSA_WITH_NULL_SHA256</td><td>20-22</td td>><</tr>><</tbody></表>
<em>注意</em>: 仅当 SSLContext
创建引擎的 已使用 初始化 PSKKeyManager
时,默认情况下才启用 PSK 密码套件。
在 1.5 中添加。
的 javax.net.ssl.SSLEngine
Java 文档。
此页面的部分内容是基于 创建和共享的工作进行的修改,并根据 署名许可中所述的术语使用。
构造函数
SSLEngine() |
的 |
SSLEngine(IntPtr, JniHandleOwnership) |
创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。 |
SSLEngine(String, Int32) |
的 |
属性
ApplicationProtocol |
返回为此连接协商的最新应用程序协议值。 |
Class |
返回此 |
DelegatedTask |
返回此引擎实例的委托任务。 |
EnableSessionCreation |
返回此引擎是否可以建立新的 SSL 会话。 |
Handle |
基础 Android 实例的句柄。 (继承自 Object) |
HandshakeApplicationProtocol |
返回当前正在进行的 SSL/TLS 握手协商的应用程序协议值。 |
HandshakeApplicationProtocolSelector |
检索在 SSL/TLS 握手期间选择应用程序协议值的回调函数。 - 或 - 注册一个回调函数,该函数为 SSL/TLS 握手选择应用程序协议值。 |
HandshakeSession |
返回 |
HandshakeStatus |
返回此引擎实例的握手状态。 |
IsInboundDone |
返回此引擎是否不再接受其他入站数据。 |
IsOutboundDone |
返回此引擎是否不再生成出站数据。 |
JniIdentityHashCode |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
JniPeerMembers |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 |
NeedClientAuth |
返回此引擎实例是否需要客户端身份验证。 |
PeerHost |
返回对等方的主机名。 |
PeerPort |
返回对等方的端口号。 |
PeerReference |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
Session |
返回此引擎实例的 SSL 会话。 |
SSLParameters |
返回对此 SSLEngine 生效的 SSLParameters。 - 或 - 将 SSLParameters 应用于此引擎。 |
ThresholdClass |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
ThresholdType |
此 API 支持 Mono for Android 基础结构,不应直接从代码中使用。 |
UseClientMode |
返回是否将此引擎设置为在握手时在客户端模式下操作。 |
WantClientAuth |
返回此引擎是否将请求客户端身份验证。 |
方法
BeginHandshake() |
在此 SSLEngine 上启动握手 (初始或重新协商) 。 |
Clone() |
创建并返回此对象的副本。 (继承自 Object) |
CloseInbound() |
指示不再向此 |
CloseOutbound() |
指示不会在此 |
Dispose() |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
Dispose(Boolean) |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
Equals(Object) |
指示某个其他对象是否“等于”此对象。 (继承自 Object) |
GetEnabledCipherSuites() |
返回当前启用用于此引擎的 SSL 密码套件的名称。 |
GetEnabledProtocols() |
返回当前启用用于此 |
GetHashCode() |
返回对象的哈希代码值。 (继承自 Object) |
GetSupportedCipherSuites() |
返回可以启用用于此引擎的密码套件的名称。 |
GetSupportedProtocols() |
返回可以启用以用于此 |
JavaFinalize() |
当垃圾回收确定不再引用对象时,由垃圾回收器对对象调用。 (继承自 Object) |
Notify() |
唤醒正在等待此对象的监视器的单个线程。 (继承自 Object) |
NotifyAll() |
唤醒正在等待此对象的监视器的所有线程。 (继承自 Object) |
SetEnabledCipherSuites(String[]) |
设置启用用于此引擎的密码套件。 |
SetEnabledProtocols(String[]) |
设置启用用于此引擎的协议版本。 |
SetHandle(IntPtr, JniHandleOwnership) |
设置 Handle 属性。 (继承自 Object) |
ToArray<T>() |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
ToString() |
返回对象的字符串表示形式。 (继承自 Object) |
UnregisterFromRuntime() |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
Unwrap(ByteBuffer, ByteBuffer) |
尝试将 SSL/TLS 网络数据解码为纯文本应用程序数据缓冲区。 |
Unwrap(ByteBuffer, ByteBuffer[]) |
尝试将 SSL/TLS 网络数据解码为一系列纯文本应用程序数据缓冲区。 |
Unwrap(ByteBuffer, ByteBuffer[], Int32, Int32) |
尝试将 SSL/TLS 网络数据解码为纯文本应用程序数据缓冲区的子序列。 |
Wait() |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>。<> (继承自 Object) |
Wait(Int64) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wait(Int64, Int32) |
导致当前线程等待,直到它被唤醒,通常是通过 em <通知/em> 或 <em>interrupted</em>,或直到经过一定数量的实时。<> (继承自 Object) |
Wrap(ByteBuffer, ByteBuffer) |
尝试将纯文本应用程序数据的缓冲区编码为 SSL/TLS 网络数据。 |
Wrap(ByteBuffer[], ByteBuffer) |
尝试将一系列数据缓冲区中的纯文本字节编码为 SSL/TLS 网络数据。 |
Wrap(ByteBuffer[], Int32, Int32, ByteBuffer) |
尝试将纯文本字节从数据缓冲区的子序列编码为 SSL/TLS 网络数据。 |
显式接口实现
IJavaPeerable.Disposed() |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
IJavaPeerable.Finalized() |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
IJavaPeerable.JniManagedPeerState |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 (继承自 Object) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 |
GetJniTypeName(IJavaPeerable) |
使用安全套接字层 (SSL) 或 IETF RFC 2246“传输层安全性” 等协议实现安全通信的类 (TLS) 协议,但独立于传输。 |