다음을 통해 공유


SSLEngine 클래스

정의

SSL(Secure Sockets Layer) 또는 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(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

보안 통신 모드에는 UL이 포함 <됩니다.>

<LI><em>무결성 보호</em>. SSL/TLS는 활성 도청기의 메시지 수정으로부터 보호합니다.

<LI><em>인증</em>. 대부분의 모드에서 SSL/TLS는 피어 인증을 제공합니다. 서버는 일반적으로 인증되며 클라이언트는 서버의 요청에 따라 인증될 수 있습니다.

<LI><em>기밀성(개인 정보 보호)</em>. 대부분의 모드에서 SSL/TLS는 클라이언트와 서버 간에 전송되는 데이터를 암호화합니다. 이렇게 하면 데이터의 기밀성을 보호하므로 수동 도청자에서 여러 종류의 재무 정보 또는 개인 정보와 같은 중요한 데이터를 볼 수 없습니다.

</UL>

이러한 종류의 보호는 지정된 SSL 연결에서 사용되는 암호화 알고리즘의 조합인 "암호 그룹"에 의해 지정됩니다. 협상 프로세스 중에 두 엔드포인트는 두 환경에서 모두 사용할 수 있는 암호 도구 모음에 동의해야 합니다. 이러한 공통 제품군이 없는 경우 SSL 연결을 설정할 수 없으며 데이터를 교환할 수 없습니다.

사용되는 암호 그룹은 "핸드셰이킹"이라는 협상 프로세스에 의해 설정됩니다. 이 프로세스의 목표는 시간이 지남에 따라 많은 연결을 보호할 수 있는 "세션"을 만들거나 다시 가입하는 것입니다. 핸드셰이크가 완료되면 메서드를 사용하여 #getSession() 세션 특성에 액세스할 수 있습니다.

클래스는 SSLSocket 거의 동일한 보안 기능을 제공하지만 모든 인바운드 및 아웃바운드 데이터는 기본적으로 차단 모델을 사용하는 기본 java.net.Socket Socket데이터를 사용하여 자동으로 전송됩니다. 이는 많은 애플리케이션에 적합하지만 이 모델은 큰 서버에 필요한 확장성을 제공하지 않습니다.

주요 차이점은 SSLEngine 전송 메커니즘과 관계없이 인바운드 및 아웃바운드 바이트 스트림에서 작동한다는 것입니다. 피어에 대한 신뢰할 수 있는 I/O 전송을 준비하는 것은 사용자의 책임 SSLEngine 입니다. SSL/TLS 추상화와 I/O 전송 메커니즘을 분리하여 기존 Input/OutputStreams, SSLEngine 로컬 java.nio.ByteBuffer ByteBuffers 또는 바이트 배열, 향후 비동기 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다양한 I/O 형식에 사용할 수 있습니다.

높은 수준에서 SSLEngine 다음과 같이 나타납니다.

app data

                           |           ^
                           |     |     |
                           v     |     |
                      +----+-----|-----+----+
                      |          |          |
                      |       SSL|Engine    |
              wrap()  |          |          |  unwrap()
                      | OUTBOUND | INBOUND  |
                      |          |          |
                      +----+-----|-----+----+
                           |     |     ^
                           |     |     |
                           v           |

                              net data

애플리케이션 데이터(일반 텍스트 또는 일반 텍스트라고도 함)는 애플리케이션에서 생성되거나 사용되는 데이터입니다. 해당 데이터는 핸드셰이크 및/또는 암호화된(암호화된) 데이터로 구성되고 I/O 메커니즘을 통해 전송될 네트워크 데이터입니다. 인바운드 데이터는 피어에서 받은 데이터이며, 아웃바운드 데이터는 피어로 향합니다.

(컨텍스트에서 SSLEngine"핸드셰이크 데이터"라는 용어는 보안 연결을 설정하고 제어하기 위해 교환되는 모든 데이터를 의미합니다. 핸드셰이크 데이터에는 SSL/TLS 메시지 "alert", "change_cipher_spec" 및 "핸드셰이크"가 포함됩니다.

에는 5개의 개별 단계가 있습니다 SSLEngine.

<OL><li> Creation - SSLEngine 생성 및 초기화되었지만 아직 사용되지 않았습니다. 이 단계에서 애플리케이션은 특정 SSLEngine설정(활성화된 암호 그룹, 클라이언트 또는 서버 모드에서 핸드셰이크해야 하는지 여부 SSLEngine 등)을 설정할 수 있습니다. 하지만 핸드셰이크가 시작되면 새 설정(클라이언트/서버 모드 제외, 아래 참조)이 다음 핸드셰이크에 사용됩니다.

<li> Initial Handshake - 초기 핸드셰이크는 SSLSession이 설정될 때까지 두 피어가 통신 매개 변수를 교환하는 절차입니다. 이 단계에서는 애플리케이션 데이터를 보낼 수 없습니다.

<li> Application Data - 통신 매개 변수가 설정되고 핸드셰이크가 완료되면 애플리케이션 데이터가 흐를 SSLEngine수 있습니다. 아웃바운드 애플리케이션 메시지는 암호화되고 무결성이 보호되며 인바운드 메시지는 프로세스를 반대로 합니다.

<li> Rehandshaking - 어느 한 쪽이 애플리케이션 데이터 단계 중에 언제든지 세션의 재협상을 요청할 수 있습니다. 새 핸드셰이크 데이터는 애플리케이션 데이터 간에 섞일 수 있습니다. 재핸드셰이크 단계를 시작하기 전에 애플리케이션은 활성화된 ciphersuites 목록 및 클라이언트 인증 사용 여부와 같은 SSL/TLS 통신 매개 변수를 다시 설정할 수 있지만 클라이언트/서버 모드 간에는 변경할 수 없습니다. 이전과 마찬가지로 핸드셰이크가 시작되면 다음 핸드셰이크까지 새 SSLEngine 구성 설정이 사용되지 않습니다.

<li> Closure - 연결이 더 이상 필요하지 않은 경우 애플리케이션은 해당 연결을 닫 SSLEngine 아야 하며, 기본 전송 메커니즘을 닫기 전에 피어에 나머지 메시지를 보내거나 받아야 합니다. 엔진이 닫힌 후에는 재사용할 수 없습니다. 새 SSLEngine 엔진을 만들어야 합니다. </OL> An SSLEngine 은 초기화된 에서 호출 SSLContext#createSSLEngine() 하여 생성됩니다 SSLContext. 구성 매개 변수를 먼저 호출하기 wrap()unwrap()beginHandshake()전에 설정해야 합니다. 이러한 메서드는 모두 초기 핸드셰이크를 트리거합니다.

데이터는 각각 아웃바운드 또는 인바운드 데이터를 호출 #wrap(ByteBuffer, ByteBuffer) wrap() 하여 #unwrap(ByteBuffer, ByteBuffer) unwrap() 엔진을 통해 이동합니다. 상태에 SSLEngine따라 호출은 wrap() 원본 버퍼의 애플리케이션 데이터를 사용하고 대상 버퍼에서 네트워크 데이터를 생성할 수 있습니다. 아웃바운드 데이터에는 애플리케이션 및/또는 핸드셰이크 데이터가 포함될 수 있습니다. 호출은 원본 버퍼를 unwrap() 검사하고 데이터가 핸드셰이크 정보인 경우 핸드셰이크를 진행하거나 데이터가 애플리케이션인 경우 대상 버퍼에 애플리케이션 데이터를 배치할 수 있습니다. 기본 SSL/TLS 알고리즘의 상태는 데이터를 사용하고 생성하는 시기를 결정합니다.

wrap() 작업 상태를 나타내는 호출 및 unwrap() 반환 SSLEngineResult 및 진행을 위해 엔진과 상호 작용하는 방법(선택 사항).

전체 SSLEngine SSL/TLS 패킷만 생성/사용하며 호출 간에 wrap()/unwrap()애플리케이션 데이터를 내부적으로 저장하지 않습니다. 따라서 생성할 수 있는 최대 레코드를 보관하려면 입력 및 출력 ByteBuffers의 크기를 적절하게 조정해야 합니다. SSLSession#getPacketBufferSize() 적절한 버퍼 크기를 확인하는 데 호출하고 SSLSession#getApplicationBufferSize() 사용해야 합니다. 아웃바운드 애플리케이션 데이터 버퍼의 크기는 일반적으로 중요하지 않습니다. 버퍼 조건이 데이터의 적절한 사용/프로덕션을 허용하지 않는 경우 애플리케이션은 (통해 SSLEngineResult) 문제를 확인하고 수정한 다음 호출을 다시 시도해야 합니다.

예를 들어 엔진 unwrap() 에서 SSLEngineResult.Status#BUFFER_OVERFLOW 사용 가능한 대상 버퍼 공간이 충분하지 않다고 판단되면 결과를 반환합니다. 애플리케이션은 해당 값을 대상 버퍼에서 사용할 수 있는 공간과 호출 SSLSession#getApplicationBufferSize() 하고 비교하여 필요한 경우 버퍼를 확대해야 합니다. 마찬가지로, 반환SSLEngineResult.Status#BUFFER_UNDERFLOW하는 경우 unwrap() 애플리케이션은 원본 버퍼에 레코드를 저장할 충분한 공간이 있는지 확인하고(필요한 경우 확대) 더 많은 인바운드 데이터를 가져오기 위해 호출 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.
              }
            }

달리 SSLSocketSSLEngine의 모든 메서드는 비차단입니다. SSLEngine 구현을 완료하는 데 시간이 오래 걸리거나 차단할 수도 있는 작업의 결과가 필요할 수 있습니다. 예를 들어 TrustManager는 원격 인증서 유효성 검사 서비스에 연결해야 하거나 KeyManager가 클라이언트 인증의 일부로 사용할 인증서를 결정하라는 메시지를 사용자에게 표시해야 할 수 있습니다. 또한 암호화 서명을 만들고 확인하면 속도가 느려지고 차단되는 것처럼 보입니다.

잠재적으로 차단 SSLEngine 될 수 있는 작업의 경우 위임된 java.lang.Runnable 작업을 만듭니다. SSLEngineResult 위임된 작업 결과가 필요하다고 표시되면 애플리케이션은 호출 #getDelegatedTask() 하여 미해결 위임된 태스크를 가져오고 해당 java.lang.Runnable#run() run() 메서드를 호출해야 합니다(컴퓨팅 전략에 따라 다른 스레드를 사용할 수 있음). 애플리케이션은 더 이상 존재하지 않을 때까지 위임된 작업을 계속 가져오고 원래 작업을 다시 시도해야 합니다.

통신 세션이 끝나면 애플리케이션이 SSL/TLS 링크를 제대로 닫아야 합니다. SSL/TLS 프로토콜에는 닫기 핸드셰이크 메시지가 있으며, 이러한 메시지는 기본 전송 메커니즘을 SSLEngine 해제하고 닫기 전에 피어에 전달되어야 합니다. 닫기를 SSLException, 인바운드 클로저 핸드셰이크 메시지 또는 닫기 메서드 중 하나로 시작할 수 있습니다. 모든 경우에 닫기 핸드셰이크 메시지는 엔진에서 생성되며 wrap() 결과 '의 상태가 "CLOSED"를 반환하거나 #isOutboundDone() true를 SSLEngineResult반환할 때까지 반복적으로 호출되어야 합니다. 메서드에서 wrap() 가져온 모든 데이터를 피어로 보내야 합니다.

#closeOutbound() 는 애플리케이션이 더 이상 데이터를 보내지 않을 것임을 엔진에 알리는 데 사용됩니다.

피어는 자체 클로저 핸드셰이크 메시지를 보내 닫겠다는 의도를 알릴 것입니다. 이 메시지가 로컬 SSLEngine호출 unwrap() 에 의해 수신 및 처리된 후 애플리케이션은 "CLOSED" 상태의 호출 unwrap() 및 검색 SSLEngineResult 을 통해 닫기를 검색하거나 true를 반환할 수 #isInboundDone() 있습니다. 어떤 이유로 피어가 적절한 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 항목이 저장됩니다. 향후 위임된 모든 작업은 이 컨텍스트를 사용하여 처리됩니다. 즉, 모든 액세스 제어 결정은 엔진 생성 시 캡처된 컨텍스트를 사용하여 결정됩니다.

<HR>

<B>동시성 참고< 사항/B>: 알아야 할 두 가지 동시성 문제가 있습니다.

<OL><li>The 및 unwrap() 메서드는 wrap() 서로 동시에 실행될 수 있습니다.

<li> SSL/TLS 프로토콜은 정렬된 패킷을 사용합니다. 애플리케이션은 생성된 패킷이 순서대로 전달되도록 주의해야 합니다. 패킷이 잘못된 순서로 도착하는 경우 예기치 않거나 치명적인 결과가 발생할 수 있습니다.

예시:

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

최종 패킷 순서를 보장할 방법이 없으므로 두 스레드는 동일한 메서드(또는 wrap()unwrap())를 동시에 호출하려고 시도해서는 안 됩니다. </OL>

<다른 Android 버전</h3>에 대한 h3 기본 구성>

SSLEngine 기본값 SSLContext 에서 가져온 인스턴스는 다음과 같이 구성됩니다.

<style type="text/css"> tr.deprecated { background-color: #ccc; color: #999; font-style: italic; }</스타일>

<h4>Protocols</h4><table><thead><tr><th>Protocol</th 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><tr><td>TLSv1</td td<>>1+</td td>><1+</td></tr tr><tr><td>TLSv1.1</td td 20+</td>><td<>td>20+</td></tr tr><td>><TLSv1.2</td td><>20+</td td>><20+</td<>/tr tr tr<>><td>TLSv1.3</td><td>29+</td td<>>29+</td<>/tr<>/tbody></table>

<h4>Cipher suites</h4><table><thead><trth><>Cipher suite</th 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<>td>9-22</td td<>>9-19</td></tr><tr class="사용되지 않음"><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 tr><class="deprecated"><td>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</td td<>>9-22</td td>><9-19</td/td></tr><tr class="deprecated"><td>SSL_DHE_RSA_WITH_DES_CBC_SHA</td td><>9-22</td td><>9-19</td></tr 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<><>/tr 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 tr<>class="deprecated"<>td>SSL_DH_anon_WITH_RC4_128_MD5</td td<>>9-22</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 tr><><td>SSL_RSA_WITH_3DES_EDE_CBC_SHA</td td>><9+</td 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<><>/tr tr<>class="deprecated"><td>SSL_RSA_WITH_NULL_SHA</td>><<td>9-22</td><td></td></tr 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/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<>/tr tr><tr<>td>TLS_CHACHA20_POLY1305_SHA256</td td>><29+</td<>td 29+</td 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 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><>20-22</td 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 tr><class="deprecated"><td>TLS_DHE_DSS_WITH_AES_256_CBC_SHA256</td td><>20-22</td<>td/td><<>/tr tr><class="deprecated"><td TLS_DHE_DSS_WITH_>><<AES_256_GCM_SHA384/td><td>20-22</td td<>></td<>/tr 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 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 tr><class="deprecated"><td>TLS_DHE_RSA_WITH_AES_128_GCM_SHA256</td td<>>20-25</td td<>>20-25</td<>/tr 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<><>/tr tr<>class="deprecated"<>td>TLS_DHE_RSA_WITH_AES_256_GCM_SHA384</td td><>20-25</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 td<>>1-8</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/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></td></tr tr><class="deprecated"><td>TLS_DH_RSA_WITH_DES_CBC_SHA</td td><>1-8</td<>td/td><<>/tr 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></tr tr<>class="deprecated"<>td>TLS_DH_anon_WITH_AES_128_CBC_SHA</td td><>9-22</td<>td></td></tr><tr class="deprecated">td>TLS_DH_anon_WITH_AES_128_CBC_SHA256</td td>><20-22</td><td></tr>< tr<>class="deprecated"><td>TLS_DH_anon_WITH_AES_128_GCM_SHA256</td td>><20-22</td td<>/td><<>/tr tr<>class="deprecated"><td>TLS_DH_anon_WITH_AES_256_CBC_SHA/<< td td><>9-22</td td><></td></tr tr><class="deprecated"<>td>TLS_DH_anon_WITH_AES_256_CBC_SHA256</td td><>20-22</td><td></td<>/tr tr><class="deprecated"<>td>TLS_DH_anon_WITH_AES_256_GCM_SHA384</td td>><20-22</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<>></tr tr<>td<>>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA</td><td>20+</td td><>20+</td></tr tr><class="deprecated"><td>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256</td td>><20-28</td td<>></td<>/tr tr><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>><20-28</td td<>/td<>></tr tr<>tr<>td>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384/< td td>><20+</td td<>>20+</td<>/tr tr><<>td>TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256</td td<>>24+</td td><>24+</td<>/tr tr tr><class="deprecated"<>td>TLS_ECDHE_ECDSA_WITH_NULL_SHA</td td><>20-22</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 tr tr><tr><td><TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA/td td><>21+</td td>><21+</td></tr tr><<>td>TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256</td td><>24+</td td<>>24+</td<>/tr tr tr<>class="deprecated"<>td>TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</td><td>20-22</td<>/td>><</tr tr><<>td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</td td><>20+</td td>><20+</td/td<>/tr tr><class="deprecated"<>td>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</td td>><20-28</td td td><></td></tr tr><><td>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</td td<>>20+</td 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 tr<><>td>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</td td>><20+</td td>><20+</td/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></tr tr><class="deprecated"><td>TLS_ECDHE_RSA_WITH_RC4_128_SHA</td><td>20-25</td<>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 tr><class="deprecated"><td>TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA</td td<>>20-22</td td<>/td<>></tr 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 tr<>class="deprecated"><td TLS_ECDH_><<ECDSA_WITH_AES_256_CBC_SHA/td><td>20-22</td<>td/td<><>/tr tr><class="deprecated"<>td>TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384</td td><>20-22</td td<>/td><<>/tr tr<>class="deprecated"><td>TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384</td><td>20-22</td><td/td<>></tr tr><class="deprecated"<>td>TLS_ECDH_ECDSA_WITH_NULL_SHA</td td>><20-22</td td><></td<>/tr tr><class="deprecated"<>td>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</td td<>>20-22</td><td></td></tr tr<>class="deprecated"><td>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</td td>><20-22</td td><<>/td<>/tr tr><class="deprecated"><td>TLS_ECDH_RSA_WITH_AES_128_CBC_SHA</td 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><></tr tr<>class="deprecated"><td TLS_ECDH_RSA_WITH_AES_256_><CBC_SHA/td><td>20-22</td td<>/td>><</tr tr><class="deprecated"><td>TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384</td td<>>20-22</td td></td<><>/tr tr<>class="deprecated"><td>TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384</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 tr><class="deprecated"><td>TLS_ECDH_RSA_WITH_RC4_128_SHA</td td<>>20-22</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><></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 tr<>class="deprecated"><td>TLS_ECDH_anon_WITH_RC4_128_SHA</td td<>>20-22</tdtd></td></tr tr>><<td>TLS_EMPTY_RENEGOTIATION_INFO_SCSV</td td><>20+</td td<>>20+</td<>/tr tr<>tr><td>TLS_FALLBACK_SCSV</td td><>21+</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 tr<>><td>TLS_PSK_WITH_AES_256_CBC_SHA</td td<>>21+</td td>><21+</td<>/tr tr tr><class="deprecated"><td>TLS_PSK_WITH_RC4_128_SHA</td td<>>21-25</td td<>/td><></tr tr><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 td>><1-8/td<>td>1-8<</td<>/tr 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 tr><td><>TLS_RSA_WITH_AES_128_GCM_SHA256</td td<>>20+</td><td>20+</td></tr 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 td<>>20-28</td td<>/td><></tr 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 tr><class="deprecated"<>td>TLS_RSA_WITH_NULL_SHA</td td><>1-8</td td><></td></tr tr><class="deprecated"<>td>TLS_RSA_WITH_NULL_SHA256</td td>><20-22</td<>td/td>><</tr><></tbody></테이블>

<em>NOTE</em>: PSK 암호 그룹은 엔진이 만들어진 통과가 .을 사용하여 PSKKeyManager초기화된 경우에만 SSLContext 기본적으로 사용하도록 설정됩니다.

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(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
JniPeerMembers

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

NeedClientAuth

이 엔진 인스턴스에 클라이언트 인증이 필요한지 여부를 반환합니다.

PeerHost

피어의 호스트 이름을 반환합니다.

PeerPort

피어의 포트 번호를 반환합니다.

PeerReference

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
Session

이 엔진 인스턴스에 대한 SSL 세션을 반환합니다.

SSLParameters

이 SSLEngine에 적용되는 SSLParameters를 반환합니다. -또는- 이 엔진에 SSLParameters를 적용합니다.

ThresholdClass

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

ThresholdType

이 API는 Android용 Mono 인프라를 지원하며 코드에서 직접 사용할 수 없습니다.

UseClientMode

핸드셰이크 시 이 엔진이 클라이언트 모드에서 작동하도록 설정되었는지 여부를 반환합니다.

WantClientAuth

이 엔진이 클라이언트 인증을 요청할지 여부를 반환합니다.

메서드

BeginHandshake()

이 SSLEngine에서 핸드셰이크(초기 또는 재협상)를 시작합니다.

Clone()

이 개체의 복사본을 만들고 반환합니다.

(다음에서 상속됨 Object)
CloseInbound()

더 이상 인바운드 네트워크 데이터가 이 SSLEngine데이터로 전송되지 않는다는 신호입니다.

CloseOutbound()

이 경우 더 이상 아웃바운드 애플리케이션 데이터가 전송 SSLEngine되지 않는다는 신호입니다.

Dispose()

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
Dispose(Boolean)

SSL(Secure Sockets Layer) 또는 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(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
ToString()

개체의 문자열 표현을 반환합니다.

(다음에서 상속됨 Object)
UnregisterFromRuntime()

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
Unwrap(ByteBuffer, ByteBuffer)

SSL/TLS 네트워크 데이터를 일반 텍스트 애플리케이션 데이터 버퍼로 디코딩하려고 시도합니다.

Unwrap(ByteBuffer, ByteBuffer[])

SSL/TLS 네트워크 데이터를 일반 텍스트 애플리케이션 데이터 버퍼 시퀀스로 디코딩하려고 시도합니다.

Unwrap(ByteBuffer, ByteBuffer[], Int32, Int32)

SSL/TLS 네트워크 데이터를 일반 텍스트 애플리케이션 데이터 버퍼의 하위 시퀀스로 디코딩하려고 시도합니다.

Wait()

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 <><중단/종료>합니다.>

(다음에서 상속됨 Object)
Wait(Int64)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wait(Int64, Int32)

현재 스레드가 각성될 때까지 대기하게 하며, 일반적으로 <>알림을 받<거나 <중단/>종료><>하거나 일정량의 실시간 경과가 발생할 때까지 대기합니다.

(다음에서 상속됨 Object)
Wrap(ByteBuffer, ByteBuffer)

일반 텍스트 애플리케이션 데이터의 버퍼를 SSL/TLS 네트워크 데이터로 인코딩하려고 시도합니다.

Wrap(ByteBuffer[], ByteBuffer)

일련의 데이터 버퍼에서 SSL/TLS 네트워크 데이터로 일반 텍스트 바이트를 인코딩하려고 시도합니다.

Wrap(ByteBuffer[], Int32, Int32, ByteBuffer)

데이터 버퍼의 하위 시퀀스에서 SSL/TLS 네트워크 데이터로 일반 텍스트 바이트를 인코딩하려고 시도합니다.

명시적 인터페이스 구현

IJavaPeerable.Disposed()

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.DisposeUnlessReferenced()

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.Finalized()

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.JniManagedPeerState

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniIdentityHashCode(Int32)

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates)

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)
IJavaPeerable.SetPeerReference(JniObjectReference)

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

(다음에서 상속됨 Object)

확장 메서드

JavaCast<TResult>(IJavaObject)

Android 런타임 확인 형식 변환을 수행합니다.

JavaCast<TResult>(IJavaObject)

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

GetJniTypeName(IJavaPeerable)

SSL(Secure Sockets Layer) 또는 IETF RFC 2246 "TLS (전송 계층 보안) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하지만 전송은 독립적인 클래스입니다.

적용 대상