Share via


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>Integrity Protection</em>. SSL/TLS는 활성 도청기에서 메시지 수정으로부터 보호합니다.

<LI><em>Authentication</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 전송 메커니즘 SSLEngine 을 분리하여 , 및 java.net.Socket Socketjava.nio.channels.Selector selectable non-blocking I/O기존 Input/OutputStreams, 로컬 java.nio.ByteBuffer ByteBuffers 또는 바이트 배열, 향후 비동기 I/O 모델 등과 같은 java.nio.channels.spi.AbstractSelectableChannel#configureBlocking(boolean) non-blocking I/O (polling)다양한 I/O 형식에 를 사용할 수 있습니다.

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

app data

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

                              net data

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

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

에 대한 5가지 개별 단계가 있습니다 SSLEngine.

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

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

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

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

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

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

wrap() 를 호출하고 unwrap() 작업의 상태 나타내는 을 반환 SSLEngineResult 하고(선택적으로) 엔진과 상호 작용하여 진행하는 방법을 반환합니다.

SSLEngine 전체 SSL/TLS 패킷만 생성/사용하며 에 대한 호출 wrap()/unwrap()간에 애플리케이션 데이터를 내부적으로 저장하지 않습니다. 따라서 생성할 수 있는 최대 레코드를 보유하려면 입력 및 출력 ByteBuffers의 크기를 적절하게 조정해야 합니다. 및 SSLSession#getApplicationBufferSize() 에 대한 SSLSession#getPacketBufferSize() 호출은 적절한 버퍼 크기를 결정하는 데 사용해야 합니다. 아웃바운드 애플리케이션 데이터 버퍼의 크기는 일반적으로 중요하지 않습니다. 버퍼 조건이 데이터의 적절한 사용/프로덕션을 허용하지 않는 경우 애플리케이션은 (를 통해 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() 는 애플리케이션이 더 이상 데이터를 보내지 않을 것임을 엔진에 알리는 데 사용됩니다.

피어는 자체 클로저 핸드셰이크 메시지를 보내 닫겠다는 의도를 알릴 것입니다. 로컬 SSLEngineunwrap() 호출에서 이 메시지를 받고 처리한 후 애플리케이션은 를 호출 unwrap() 하고 "CLOSED"를 상태 를 검색 SSLEngineResult 하거나 true를 반환하면 닫기를 검색할 #isInboundDone() 수 있습니다. 어떤 이유로 피어가 적절한 SSL/TLS 닫기 메시지를 보내지 않고 통신 링크를 닫는 경우 애플리케이션은 스트림의 끝을 감지하고 더 이상 처리할 인바운드 메시지가 없음을 통해 #closeInbound() 엔진에 신호를 보낼 수 있습니다. 일부 애플리케이션은 피어에서 순서대로 종료 메시지를 요구하도록 선택할 수 있습니다. 이 경우 스트림 종료 조건이 아니라 핸드셰이크 메시지에 의해 클로저가 생성되었음을 검사 수 있습니다.

암호 그룹을 관리할 때 알아야 할 두 가지 암호 그룹 그룹이 있습니다.

<UL><LI><em>Supported</em> 암호 그룹: SSL 구현에서 지원되는 모든 제품군입니다. 이 목록은 를 사용하여 #getSupportedCipherSuites()보고됩니다.

<LI><em>지원되는 제품군의 전체 집합보다 작을 수 있는 암호 그룹 사용</포함> 이 그룹은 메서드를 #setEnabledCipherSuites(String []) 사용하여 설정되고 메서드를 사용하여 쿼리됩니다 #getEnabledCipherSuites() . 처음에는 제안된 최소 구성을 나타내는 새 엔진에서 기본 암호 그룹 집합이 사용하도록 설정됩니다. </Ul>

구현 기본값을 사용하려면 서버를 인증하고 기밀성을 제공하는 암호 그룹만 기본적으로 사용하도록 설정해야 합니다. 양측이 인증되지 않은 및/또는 비공개(암호화되지 않은) 통신에 명시적으로 동의하는 경우에만 이러한 암호 제품군이 선택됩니다.

각 SSL/TLS 연결에는 하나의 클라이언트와 하나의 서버가 있어야 하므로 각 엔드포인트는 어떤 역할을 맡을지 결정해야 합니다. 이 선택은 핸드셰이크 프로세스를 시작하는 사람과 각 당사자가 보내야 하는 메시지 유형을 결정합니다. 메서드 #setUseClientMode(boolean) 는 모드를 구성합니다. 초기 핸드셰이크가 시작되면 는 재협상을 SSLEngine 수행하는 경우에도 클라이언트 모드와 서버 모드 간에 전환할 수 없습니다.

애플리케이션은 다른 스레드에서 위임된 작업을 처리하도록 선택할 수 있습니다. 이 SSLEngine 만들어지면 현재 java.security.AccessControlContext 가 저장됩니다. 향후 위임된 모든 작업은 이 컨텍스트를 사용하여 처리됩니다. 즉, 모든 액세스 제어 결정은 엔진 생성 시 캡처된 컨텍스트를 사용하여 결정됩니다.

<Hr>

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

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

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

예를 들면 다음과 같습니다.

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

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

<h3>다른 Android 버전</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<>><td>TLSv1</td td>><1+</td td><>1+</td<>/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><tr><th>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="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 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><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 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><></td></tr tr<>class="deprecated"><td>SSL_RSA_WITH_NULL_SHA</tdd>><<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<>td>9-23</td/td 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<>/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><<>/tr tr><class="deprecated"<>td>TLS_DHE_DSS_WITH_AES_128_GCM_SHA256</td td><td>20-22</td td tdd><></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><td1-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 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><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></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></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></td></Tr><tr class="deprecated">td>TLS_DH_anon_WITH_AES_128_CBC_SHA256</td td>><20-22</td 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></td<>/tr tr><class="deprecated"><td>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</td td><>20-22</td td>><</td></tr 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>><<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><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><><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<>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 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 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 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></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<><>/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 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<<>>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 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 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에 추가되었습니다.

에 대한 Java 설명서입니다 javax.net.ssl.SSLEngine.

이 페이지의 일부는 만들고 공유하며 에 설명된 용어에 따라 사용되는 작업을 기반으로 수정됩니다.

생성자

SSLEngine()

내부 세션 재사용 전략에 대한 SSLEngine 힌트를 제공하지 않는 에 대한 생성자입니다.

SSLEngine(IntPtr, JniHandleOwnership)

JNI 개체의 관리되는 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다.

SSLEngine(String, Int32)

에 대한 생성자입니다 SSLEngine.

속성

ApplicationProtocol

이 연결에 대해 협상된 가장 최근의 애플리케이션 프로토콜 값을 반환합니다.

Class

Object의 런타임 클래스를 반환합니다.

(다음에서 상속됨 Object)
DelegatedTask

이 엔진 instance 대한 대리자 작업을 반환합니다.

EnableSessionCreation

이 엔진에서 새 SSL 세션을 설정할 수 있는지 여부를 반환합니다.

Handle

기본 Android instance 대한 핸들입니다.

(다음에서 상속됨 Object)
HandshakeApplicationProtocol

현재 진행 중인 SSL/TLS 핸드셰이크에서 협상된 애플리케이션 프로토콜 값을 반환합니다.

HandshakeApplicationProtocolSelector

SSL/TLS 핸드셰이크 중에 애플리케이션 프로토콜 값을 선택하는 콜백 함수를 검색합니다. -또는- SSL/TLS 핸드셰이크에 대한 애플리케이션 프로토콜 값을 선택하는 콜백 함수를 등록합니다.

HandshakeSession

SSLSession SSL/TLS 핸드셰이크 중에 생성되는 를 반환합니다.

HandshakeStatus

이 엔진 instance 핸드셰이크 상태 반환합니다.

IsInboundDone

이 엔진에서 더 이상 인바운드 데이터를 수락하지 않을지 여부를 반환합니다.

IsOutboundDone

이 엔진에서 더 이상 아웃바운드 데이터를 생성하지 않을지 여부를 반환합니다.

JniIdentityHashCode

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

(다음에서 상속됨 Object)
JniPeerMembers

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

NeedClientAuth

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

PeerHost

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

PeerPort

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

PeerReference

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

(다음에서 상속됨 Object)
Session

이 엔진 instance 대한 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()

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

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

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

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

현재 스레드가 깨어날 때까지 대기하게 하며, 일반적으로 <알림을 받<>거나 중단</>em>>을 받거나 <일정량의 실시간이 경과할 때까지 대기합니다.

(다음에서 상속됨 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(전송 계층 보안 ) 프로토콜"과 같은 프로토콜을 사용하여 보안 통신을 사용하도록 설정하는 클래스이지만 전송은 독립적입니다.

적용 대상