SSLEngine 类

定义

一个类,它使用安全套接字层(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
继承
SSLEngine
属性

注解

一个类,它使用安全套接字层(SSL)或 IETF RFC 2246“传输层安全性”(TLS) 协议等协议实现安全通信,但传输无关。

安全通信模式包括: <UL>

<LI><em>完整性保护</em>。 SSL/TLS 可防止活动 Wiretapper 修改消息。

<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.net.Socket Socketjava.nio.channels.spi.AbstractSelectableChannel#configureBlocking(boolean) non-blocking I/O (polling)java.nio.channels.Selector selectable non-blocking I/O,以及传统的 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 消息“alert”、“change_cipher_spec”和“握手”。

有五个不同的 SSLEngine阶段。

<OL><li> Creation - SSLEngine 已创建和初始化,但尚未使用。 在此阶段,应用程序可以设置任何 SSLEngine特定设置(启用的密码套件、客户端 SSLEngine 模式还是服务器模式中应握手等)。 不过,一旦开始握手,任何新设置(客户端/服务器模式除外),都将用于下一次握手。

<li> Initial Handshake - 初始握手是两个对等方在建立 SSLSession 之前交换通信参数的过程。 在此阶段,无法发送应用程序数据。

<li> 应用程序数据 - 建立通信参数并完成握手后,应用程序数据可能会流经 SSLEngine。 出站应用程序消息经过加密并受到完整性保护,入站消息将反转进程。

<li> Rehandshaking - 任一方可能会在应用程序数据阶段随时请求重新协商会话。 新的握手数据可以在应用程序数据之间混合。 在开始重新调整阶段之前,应用程序可以重置 SSL/TLS 通信参数,例如启用的密码套件列表以及是否使用客户端身份验证,但不能在客户端/服务器模式之间更改。 与以前一样,一旦开始握手,任何新的 SSLEngine 配置设置都不会在下次握手之前使用。

<li> Close - 当不再需要连接时,应用程序应关闭 SSLEngine 该连接,并在关闭基础传输机制之前向对等方发送/接收任何剩余消息。 关闭引擎后,它不可重用:必须创建一个新 SSLEngine 引擎。 </OL> An SSLEngine 是通过从初始化SSLContext的调用SSLContext#createSSLEngine()创建的。 在首次调用或调用wrap()unwrap()beginHandshake()之前,应设置任何配置参数。 这些方法都触发初始握手。

数据通过调用 #wrap(ByteBuffer, ByteBuffer) wrap()#unwrap(ByteBuffer, ByteBuffer) unwrap() 出站或入站数据分别通过引擎移动。 根据状态 SSLEnginewrap() 调用可能会使用源缓冲区中的应用程序数据,并可能在目标缓冲区中生成网络数据。 出站数据可能包含应用程序和/或握手数据。 调用 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() 返回 a 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状态返回“CLOSED”或 #isOutboundDone() 返回 true。 从 wrap() 该方法获取的所有数据都应发送到对等方。

#closeOutbound() 用于向引擎发出信号,即应用程序不会发送更多数据。

对等方将通过发送自己的关闭握手消息来发出关闭意图。 在本地调用接收和处理SSLEngineunwrap()此消息后,应用程序可以通过调用unwrap()并查找SSLEngineResult状态为“CLOSED”的关闭,或者如果#isInboundDone()返回 true 来检测关闭。 如果由于某种原因,对等方关闭通信链接而不发送正确的 SSL/TLS 关闭消息,则应用程序可以检测流结束,并可以通过该消息向引擎 #closeInbound() 发出信号,这样就不会再处理入站消息。 某些应用程序可能选择要求从对等方有序关闭消息,在这种情况下,他们可以检查关闭是由握手消息生成的,而不是由流结束条件生成的。

有两组密码套件,在管理密码套件时需要了解:

<UL><LI><em>支持</em> 密码套件:SSL 实现支持的所有套件。 此列表是使用 #getSupportedCipherSuites().

<LI><em>Enabled</em> 密码套件,可能少于完整的受支持套件集。 此组是使用 #setEnabledCipherSuites(String []) 该方法设置的,并使用该方法 #getEnabledCipherSuites() 进行查询。 最初,将在表示建议的最低配置的新引擎上启用一组默认的密码套件。 </UL>

实现默认值要求仅启用对服务器进行身份验证并提供机密性的密码套件。 仅当双方明确同意未经身份验证和/或非专用(未加密)通信时,才会选择此类密码套件。

每个 SSL/TLS 连接必须有一个客户端和一个服务器,因此每个终结点必须决定要承担的角色。 此选项确定谁开始握手过程,以及每方应发送哪种类型的消息。 #setUseClientMode(boolean)该方法配置模式。 初始握手启动后,即使执行重新协商, SSLEngine 客户端模式和服务器模式之间也无法切换。

应用程序可能会选择处理不同线程中的委托任务。 创建时 SSLEngine ,将保存当前 java.security.AccessControlContext 值。 将来的所有委托任务都将使用此上下文进行处理:也就是说,将使用在引擎创建时捕获的上下文执行所有访问控制决策。

HR

<B>并发说明</B>:有两个并发问题需要注意:

<OL><li>The wrap() and unwrap() methods may concurrently execute of other.

<li> SSL/TLS 协议采用有序数据包。 应用程序必须注意确保生成的数据包按顺序传递。 如果数据包已无序到达,则可能会发生意外或致命的结果。

例如:

synchronized (outboundLock) {
                             sslEngine.wrap(src, dst);
                             outboundQueue.put(dst);
                         }

作为结果,两个线程不得同时尝试调用同一方法(或wrap()unwrap()),因为无法保证最终数据包排序。 </老>

<不同 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>><th Enabled by default (API Levels)<</th></tr></thead><tbody<>tr class=“deprecated”><td>SSLv3</td td><>1–25</td td><>1–22</td<>/tr<>tr><td>TLSv1</td><td>1+</td td>><1+</td></tr><tr><td>TLSv1.1</td<>td>20+</td><td>20+</td<>/tr<<>>td>TLSv1.2</td<>td>20+</td><td>20+</td></tr<>tr><td>TLSv1.3</td><td>29+</td<>td>29+</td></tr<>/tbody></table>

<h4>密码套件</h4<>表<>thead<>tr><th>Cipher suite</th><>supported (API Levels)/th><>th Enabled by default (API Levels)<</th></tr/thead><tbody<>tr>< class=“deprecated”<>td>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</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><tr class=“deprecated”<>td>SSL_DHE_DSS_WITH_DES_CBC_SHA/td td>9-22</><td<>td>9-19</td<>/tr><tr class=“deprecated”><>td SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA<</td><>td 9-22</td td td><>9-19</td/tr<>class=“deprecated”<>td>< SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td td>>9-22</td><><td td>9-19</td<>/tr<>class=“deprecated”<>td>SSL_DHE_RSA_WITH_DES_CBC_SHA</><td td>9-22</<>>td 9-19</td<>/tr<>tr class=“deprecated”><td>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</td><td>9-22</td<>td/td><></tr<>tr class=“deprecated”<>td>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</td td>9-22</<>td><td td/<>td></tr<>class=“deprecated”><td>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</td 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>9-22</<>td td td></<>tr><tr class=“deprecated”><td SSL_RSA_EXPORT_><WITH_DES40_CBC_SHA/td td>><9-22</td td>><9-19</td<>/tr><tr class=“deprecated”><td>SSL_RSA_EXPORT_WITH_RC4_40_MD5</td>><td 9-22</<>td td>9-19</td<>/tr><><td>SSL_RSA_WITH_3DES_EDE_CBC_SHA</td>><9+</td><td>9-19</td></tr><tr class=“deprecated”><td SSL_RSA_WITH_DES_CBC_SHA</td><td>>9-22</td<>td>9-19</td<>/tr<>tr class=“deprecated”<>td>SSL_RSA_WITH_NULL_MD5</<>td td>9-22</><td 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<>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<>tr><td>TLS_AES_256_GCM_SHA384</td td>29+/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<>tr class=“deprecated”><td>TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA</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<>tr class=“deprecated”><td>TLS_DHE_DSS_WITH_AES_128_CBC_SHA256</td td<>td>20-22</td<>td><></<>tr tr class=“deprecated”<>>td TLS_DHE_DSS_WITH_AES_128_GCM_SHA256</td><>td 20-22</td td td><></td></tr>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 td>20-22</><td td td/td><></tr<>class=“deprecated”>><td TLS_DHE_DSS_WITH_<<AES_256_GCM_SHA384/td td><>20-22</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><1-8</td>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><tr class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_128_CBC_SHA</><td td 9-25/td><td>>9-25<</td></tr><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><>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><tr class=“deprecated”><td>TLS_DHE_RSA_WITH_AES_256_CBC_SHA256</td td>20-25</td<><>td/><td td></tr<>class=“deprecated”><>td TLS_DHE_RSA_WITH_AES_256_GCM_SHA384</td>><td 20-25/td td 20-25<</td><>></tr><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>1-8</td><td/td><></tr><tr class=“deprecated”><td TLS_DH_DSS_><WITH_3DES_EDE_CBC_SHA/td td><>1-8</td><td/td<>></tr><tr class=“deprecated”><td>TLS_DH_DSS_WITH_DES_CBC_SHA</td<>td>1-8</td><td></><><tr tr class=“deprecated”><>td TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA</td><>td 1-8</td><td/td></tr><tr class=“deprecated”><td TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA</td><td>>1-8</td<>td></tr><>< tr class=“deprecated”<>td>TLS_DH_RSA_WITH_DES_CBC_SHA</td><>1-8</<>td td/td><></tr><class=“deprecated”><td TLS_DH_anon_EXPORT_WITH_>><<DES40_CBC_SHA/td td><>1-8</td><td/td>><</tr<>tr class=“deprecated”><td>TLS_DH_anon_WITH_3DES_EDE_CBC_SHA</td><td>1-8</td<>td td/><td></tr<>tr class=“deprecated”<>>td TLS_DH_anon_WITH_AES_128_CBC_SHA</td><>td 9-22</td td<>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/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/><td></tr><class=“deprecated”><td>TLS_DH_anon_WITH_AES_256_GCM_SHA384</td><>20-22</td<>td td/td<><>/tr><><tr class=“deprecated”><td>TLS_DH_anon_WITH_DES_CBC_SHA</td<>td>1-8</td<>td></<>tr<>tr class=“deprecated”<>td>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</<>td td>20-22</><td 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></<>tr<>><td td>TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256</td><td 20+/td td>20+<</td<>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 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><tr class=“deprecated”>><td TLS_ECDHE_ECDSA_WITH_NULL_SHA</td<>td>20-22</td><td td/><><td></tr><tr class=“deprecated”><td TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</td<>td>>20-25</td td>><20-23</td<>/tr><><tr td>TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA</<>td td 21+</><td td>21+</td 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<>tr class=“deprecated”><td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</td>><20-28</td td td><></td></tr><tr><td>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</td><td 20+/td td>>20+<</td><<>/tr<>tr><td>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</td td>20+/td><td 20+<</td><><>/tr><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><tr<>td TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256</td td><td>>24+</td<>td>24+</td></tr><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 20-23</td><>></tr><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>20-22</td<>td/td><></tr><tr class=”deprecated“><td>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256</td><td>20-22</td><td/td><></tr<>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/<>td></tr><tr class=“deprecated”<>td>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</td><td>20-22</td td><td/td><></tr><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<>>20-22</td<>td/td><></tr><tr class=“deprecated”><td>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256</td<>td>20-22</td<>td/td></tr><<> tr class=“deprecated”<>td>TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256</td td>20-22</<>td><td td/td><></tr><tr class=“deprecated”><td TLS_ECDH_RSA_WITH_AES_256_><CBC_SHA/td<>td>20-22</td<>td/td><></tr><class=“deprecated”<>td>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384</td td>20-22</<>td<>td td/><td></tr><class=“deprecated”>><td TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384</td td><>td 20-22</td><td></td></tr><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<>>20-22</td<>td/td><></tr><tr class=“deprecated”><td>TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</td<>td>20-22</td td/td>><<></tr<>tr class=“deprecated”<>td>TLS_ECDH_anon_WITH_AES_128_CBC_SHA</td td>20-22</><td><td td/td><></tr><tr class=“deprecated”><td TLS_ECDH_anon_WITH_AES_256_><CBC_SHA/td><td>20-22</td><td/td>><</tr><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><tr><td>TLS_EMPTY_RENEGOTIATION_INFO_SCSV</td><td 20+</td<>td>>20+</td<>/tr>><<tr td>TLS_FALLBACK_SCSV</td td>21+</td<>><td td/td<>></tr<>tr class=“deprecated”><td><TLS_NULL_WITH_NULL_NULL/td td>><1-8</td><td/td<>></tr><tr class=“deprecated”><td>TLS_PSK_WITH_3DES_EDE_CBC_SHA</td><td>21-22</td<>td/<>td></tr<>><tr 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><tr class=“deprecated”><td>TLS_PSK_WITH_RC4_128_SHA</><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><tr class=“deprecated”<>td>TLS_RSA_WITH_3DES_EDE_CBC_SHA</<>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<>tr class=“deprecated”><td>TLS_RSA_WITH_AES_128_CBC_SHA256</td td>20-28</td<<>>td/><td></tr><><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><tr class=“deprecated”><td>TLS_RSA_WITH_AES_256_CBC_SHA256</><td>20-28</td<>td/td><></tr 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><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></<<>>tr class=“deprecated”>><td TLS_RSA_WITH_NULL_SHA256</td><td td>20-22</td<>td td/td>><</tr></tbody></桌子>

<em>NOTE</em>: PSK 密码套件默认处于启用状态,SSLContext前提是创建引擎时已使用 a.PSKKeyManager

在 1.5 中添加。

适用于 . 的 javax.net.ssl.SSLEngineJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

构造函数

SSLEngine()

内部 SSLEngine 会话重用策略没有提示的构造函数。

SSLEngine(IntPtr, JniHandleOwnership)

创建 JNI 对象的托管表示形式时使用的构造函数;由运行时调用。

SSLEngine(String, Int32)

.. 的 SSLEngine构造函数

属性

ApplicationProtocol

返回为此连接协商的最新应用程序协议值。

Class

返回此 Object的运行时类。

(继承自 Object)
DelegatedTask

返回此引擎实例的委托任务。

EnableSessionCreation

返回此引擎是否可以建立新的 SSL 会话。

Handle

基础 Android 实例的句柄。

(继承自 Object)
HandshakeApplicationProtocol

返回当前正在进行中的 SSL/TLS 握手协商的应用程序协议值。

HandshakeApplicationProtocolSelector

检索在 SSL/TLS 握手期间选择应用程序协议值的回调函数。 - 或 - 注册一个回调函数,该函数为 SSL/TLS 握手选择应用程序协议值。

HandshakeSession

返回 SSLSession 在 SSL/TLS 握手期间构造的构造。

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()

指示不会再向此 SSLEngine发送任何入站网络数据。

CloseOutbound()

指示不会对此 SSLEngine发送更多出站应用程序数据。

Dispose()

一个类,它使用安全套接字层(SSL)或 IETF RFC 2246“传输层安全性”(TLS) 协议等协议实现安全通信,但传输无关。

(继承自 Object)
Dispose(Boolean)

一个类,它使用安全套接字层(SSL)或 IETF RFC 2246“传输层安全性”(TLS) 协议等协议实现安全通信,但传输无关。

(继承自 Object)
Equals(Object)

指示其他对象是否“等于”此对象。

(继承自 Object)
GetEnabledCipherSuites()

返回当前启用用于此引擎的 SSL 密码套件的名称。

GetEnabledProtocols()

返回当前启用用于此 SSLEngine协议的协议版本的名称。

GetHashCode()

返回对象的哈希代码值。

(继承自 Object)
GetSupportedCipherSuites()

返回可用于此引擎的密码套件的名称。

GetSupportedProtocols()

返回可用于此 SSLEngine协议的协议的名称。

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) 协议等协议实现安全通信,但传输无关。

适用于