|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjavax.net.ssl.SSLEngine
public abstract class SSLEngine
Secure Sockets Layer (SSL)나 IETF RFC 2246 의 Transport Layer Security (TLS) 프로토콜을 사용해, 전송에 의존하는 일 없이 시큐어 통신을 유효하게 하는 클래스입니다.
시큐어 통신 모드에서는, 다음의 시큐리티 보호가 실시됩니다.
사용되는 암호화 방식군은, 「핸드 쉐이크」라고 불리는 협상 프로세스에 의해 확립됩니다. 핸드 쉐이크에서는, 세션의 작성 또는 참가를 합니다. 작성 또는 참가한 세션은, 무효가 될 때까지 다양한 접속을 보호합니다. 핸드 쉐이크가 완료하면(자),getSession()
메소드를 사용해 세션 속성에 액세스 할 수 있습니다.
SSLSocket
클래스도 거의 같은 시큐리티 기능을 제공합니다만, 모든 착신 및 발신 데이터는, 의도적으로 블록 모델을 사용하는 부하 Socket
에 의해 자동적으로 송신됩니다. 이 처리는 많은 어플리케이션에 대해서 적절합니다만, 이 모델은 대규모 서버에 필요한 확장성을 가져오지 않습니다.
SSLEngine
의 주된 특장으로서 전송 기구에 의존하는 일 없이 착신/송신 바이트 스트림을 조작할 수 있는 점을 들 수 있습니다. SSLEngine
사용자는, 피어에 있어서의 입출력 전송의 신뢰성을 확보할 필요가 있습니다. SSL/TLS 추상화 객체를 입출력 전송 기구로부터 떼어내는 것으로,SSLEngine
를 다양한 입출력으로 광범위하게 이용할 수가 있습니다. 예를 들어,비블록 입출력 (폴링)
,선택형비블록 입출력
외,Socket
및 종래의 Input/OutputStream, 로컬 ByteBuffers
, 바이트 배열,future asynchronous 입출력 모델등의 입출력으로 이용 가능합니다.
상층부에서는,SSLEngine
는 다음과 같이 나타내집니다.
app data | ^ | | | v | | +----+-----|-----+----+ | | | | SSL|Engine | wrap() | | | unwrap() | OUTBOUND | INBOUND | | | | +----+-----|-----+----+ | | ^ | | | v | net data어플리케이션 데이터 (별명 「plaintext」또는 「clear text」)는, 어플리케이션에 의해 생성 또는 소비되는 데이터입니다. 어플리케이션 데이터와 대가 되는 것으로서 네트워크 데이터가 있습니다. 네트워크 데이터는, 핸드 쉐이크나 암호화 데이터로 구성되어 입출력 기구를 개입시켜 전송 되는 데이터입니다. 착신 데이터는 피어로부터 수신되는 데이터, 송신 데이터는 피어에 송신되는 데이터입니다.
SSLEngine
의 문맥에서는, 시큐어 접속의 확립 및 제어 목적으로 교환되는 데이터를 「핸드 쉐이크 데이터」라고 총칭합니다. 핸드 쉐이크 데이터에는, SSL/TLS 메세지 alert, change_cipher_spec, handshake 등이 있습니다.
SSLEngine
는, 다음의 5 개의 단계를 더듬습니다.
SSLEngine
의 작성과 초기화는 완료했습니다만, 아직 사용되고는 있지 않습니다. 이 단계에서는, 어플리케이션에 의해,SSLEngine
고유의 모든 설정 (암호화 방식군의 유효화,SSLEngine
가 클라이언트 모드와 서버 모드의 어디에서 핸드 쉐이크를 실시할까 등)을 실시할 수가 있습니다. 핸드 쉐이크가 시작되면(자), 다음의 핸드 쉐이크로부터 클라이언트/서버 모드의 설정을 제외한 (아래와 같이 참조) 새로운 설정이 사용됩니다.
SSLEngine
로부터 어플리케이션 데이터가 송신됩니다. 송신 어플리케이션 메세지는 암호화되어 데이터의 무결성이 확보됩니다. 착신 메세지에서는, 이 반대의 수속을 합니다.
SSLEngine
설정은 사용되지 않습니다.
SSLEngine
를 종료해, 피어와 송수신 하는 메세지가 남아 있는 경우는 송수신을 완료하고 나서, 부하의 전송 기구를 종료할 필요가 있습니다. 종료된 엔진은, 재사용할 수 없습니다. 새로운 SSLEngine
를 작성할 필요가 있습니다.
SSLEngine
를 작성하려면 , 초기화된 SSLContext
로부터 SSLContext.createSSLEngine()
를 호출합니다. 모든 설정 파라미터의 설정을 완료하고 나서,wrap()
,unwrap()
, 또는 beginHandshake()
의 최초의 호출을 실시합니다. 이러한 메소드는 모두, 초기 핸드 쉐이크를 트리거합니다.
데이터는, 송신 데이터에 대해서 wrap()
를 호출하거나 착신 데이터에 대해서 unwrap()
를 호출하는 것에 의해, 엔진으로부터 전송 됩니다. SSLEngine
상태에 따라서는,wrap()
호출에 의해 소스 버퍼의 어플리케이션 데이터가 사용되어 행선지 버퍼에 네트워크 데이터가 써내지는 경우도 있습니다. 송신 데이터에는, 어플리케이션 데이터나 핸드 쉐이크 데이터가 포함됩니다. unwrap()
를 호출하면(자), 소스 버퍼가 체크되어 그 중의 데이터가 핸드 쉐이크 정보이면 핸드 쉐이크가 실시됩니다. 어플리케이션 데이터이면, 행선지 버퍼에 포함됩니다. 부하의 SSL/TLS 알고리즘 상태로부터, 데이터의 사용이나 생성의 타이밍을 판단할 수 있습니다.
wrap()
나 unwrap()
를 호출하면(자), 오퍼레이션 상태와 처리를 속행하는 경우의 엔진과의 교환의 내용 (옵션)을 나타내는 SSLEngineResult
가 돌려주어집니다.
SSLEngine
는, 완전한 SSL/TLS 패킷 밖에 사용 또는 생성하지 않습니다. 다음의 wrap()
또는 unwrap()
의 호출까지의 사이에, 어플리케이션 데이터를 내부에 포함할 것은 없습니다. 따라서, 생성되는 레코드중 제일 사이즈가 큰 것을 포함할 수 있도록(듯이), 입출력 ByteBuffer
의 사이즈를 결정할 필요가 있습니다. 적절한 버퍼 사이즈를 판정하려면 ,SSLSession.getPacketBufferSize()
및 SSLSession.getApplicationBufferSize()
의 호출을 사용합니다. 송신 어플리케이션 데이터 버퍼의 사이즈는, 일반적으로, 고려할 필요는 없습니다. 데이터의 사용 및 생성에 적절한 버퍼 조건이 아닌 경우, 어플리케이션은 SSLEngineResult
에 의해 문제를 특정해, 수정한 뒤, 재차 호출을 시행하지 않으면 안됩니다.
예를 들어, 유효한 행선지 버퍼의 용량이 불충분하다라고 엔진이 판정했을 경우,unwrap()
는 SSLEngineResult.Status.BUFFER_OVERFLOW
의 결과를 돌려줍니다. 필요에 따라서, 어플리케이션으로 SSLSession.getApplicationBufferSize()
를 호출해, 그 값과 행선지 버퍼내의 유효한 용량을 비교해, 버퍼를 크게 하도록 해 주세요. 같이unwrap()
가 SSLEngineResult.Status.BUFFER_UNDERFLOW
를 돌려주려고 했을 경우는, 어플리케이션으로 SSLSession.getPacketBufferSize()
를 호출해, 레코드를 보관 유지하는데 충분한 용량을 소스 버퍼에 확보해 (또, 필요에 따라서 확장해), 보다 많은 착신 데이터를 취득하도록 해 주세요.
SSLEngineResult r = engine.unwrap(src, dst); switch (r.getStatus()) { BUFFER_OVERFLOW: // Could attempt to drain the dst buffer of any already obtained // data, but we'll just increase it to the size needed. int appSize = engine.getSession(). getApplicationBufferSize(); ByteBuffer b = ByteBuffer.allocate(appSize + dst.position()); dst.flip(); b.put(dst); dst = b; // retry the operation. break; BUFFER_UNDERFLOW: int netSize = engine.getSession(). getPacketBufferSize(); // Resize buffer if needed. if (netSize > dst.capacity()) { ByteBuffer b = ByteBuffer.allocate(netSize); src.flip(); b.put(src); src = b; } // Obtain more inbound network data for src, // then retry the operation. break; // other cases: CLOSED, OK. }
SSLSocket
과는 달리, SSLEngine 의 모든 메소드는 비동기 메소드입니다. SSLEngine
구현을 위해서(때문에) 필요한 태스크는, 완료까지 꽤 시간이 걸리거나 완료전에 블록 될 가능성이 있습니다. 예를 들어, TrustManager 는, 원격 증명서 확인 서비스에의 접속이 요구되는 일이 있습니다. 또, KeyManager 는, 클라이언트 인증의 일환으로서 사용해야 할 증명서를 결정하도록(듯이) 사용자에게 요구하는 일이 있습니다. 게다가 암호화 서명을 작성해, 이것들을 검증하는 경우, 처리 시간이 꽤 길어져, 처리가 블록 된 것처럼 보이는 일이 있습니다.
SSLEngine
는, 블록 될 가능성이 있는 모든 오퍼레이션에 대해서,Runnable
위양 태스크를 생성합니다. SSLEngineResult
에 의해, 위양 태스크의 결과의 필요성이 나타났을 경우, 어플리케이션은 getDelegatedTask()
를 호출해 미실행의 위양 태스크를 취득해, 그 run()
메소드를 호출할 필요가 있습니다. 호출에 사용되는 thread는, 계산방법에 따라서 다릅니다. 어플리케이션은, 모든 위양 태스크를 취득하면(자), 최초의 오퍼레이션을 재시행합니다.
어플리케이션은, 통신 세션의 종료시에 SSL/TLS 링크를 정상적으로 종료할 필요가 있습니다. SSL/TLS 프로토콜은 핸드 쉐이크 종료 메세지를 가지고 있어 이러한 메세지는,SSLEngine
가 해제되어 부하의 전송 기구가 종료하기 전에 피어에 송신되게 되어 있습니다. 통신 세션의 종료는, SSLException, 핸드 쉐이크 종료 메세지의 착신, 또는 임의의 종료 메소드에 의해 개시됩니다. 어느 경우에서도, 엔진으로부터 핸드 쉐이크 종료 메세지가 생성되어SSLEngineResult
상태가 CLOSED 가 되는지,isOutboundDone()
의 반환값이 true 가 될 때까지,wrap()
가 반복해 불려 갑니다. wrap()
메소드에 의해 취득된 데이터는 모두 피어에 송신됩니다.
어플리케이션으로부터 송신되는 데이터가 이제 없는 것을 엔진에 통지하려면 ,closeOutbound()
를 사용합니다.
피어는, 고유의 핸드 쉐이크 종료 메세지를 송신하는 것으로, 종료의 의도를 통지합니다. 이 메세지가 로컬의 SSLEngine
의 unwrap()
호출에 의해 수신 및 처리되면(자), 어플리케이션은,unwrap()
를 호출해, 상태가 CLOSED 의 SSLEngineResult
를 검색합니다. 조건에 맞는 것이 발견되는지,isInboundDone()
의 반환값이 true 이면, 종료가 확인됩니다. 피어가 통신 링크를 종료할 때, 어떠한 이유로써 정상적인 SSL/TLS 종료 메세지가 송신되지 않았던 경우, 어플리케이션은 스트림의 종료 위치를 검출해, 더 이상 처리해야 할 착신 메세지가 없는 것을,closeInbound()
를 개입시켜 엔진에 통지합니다. 어플리케이션에 따라서는, 피어로부터의 종료 메세지를 일반적으로대로 받는 설정이 되어 있는 일이 있습니다. 이러한 어플리케이션은, 스트림의 종료 위치는 아니고, 핸드 쉐이크 메세지에 의해 종료를 체크합니다.
암호화 방식군을 사용할 때는, 2 개의 그룹에 대해 이해할 필요가 있습니다.
getSupportedCipherSuites()
를 사용해 보고된다.
setEnabledCipherSuites(String [])
메소드를 사용해 설정해,getEnabledCipherSuites()
메소드를 사용해 조회한다. 새로운 엔진에서는, 최소한의 추천 구성을 나타내는 디폴트의 암호화 방식군이 사용 가능하게 되어 있다.
각 SSL/TLS 접속에는 클라이언트와 서버가 1 대씩 필요합니다. 이 때문에, 각 끝으로 담당하는 롤을 결정할 필요가 있습니다. 이 선택 내용에 의해, 어느 쪽측으로부터 핸드 쉐이크 처리를 개시하는지, 또, 서로 어떠한 메세지를 송신할지가 정해집니다. 모드의 설정은,setUseClientMode(boolean)
메소드로 실시합니다. 일단 초기 핸드 쉐이크가 개시되고 나서는, 재협상의 경우에서도,SSLEngine
의 모드를 클라이언트로부터 서버, 서버로부터 클라이언트로 전환할 수 없습니다.
위양 태스크는 별thread로 처리할 수가 있습니다. SSLEngine
가 작성되면(자), 현재 AccessControlContext
가 보존됩니다. 그 후, 모든 위양 태스크는 이 문맥으로 처리됩니다. 즉, 액세스 제어의 의사결정은 모두, 엔진의 작성시의 문맥으로 행해집니다.
wrap()
메소드와 unwrap()
메소드는, 병행 실행이 가능합니다.
다음에 예를 나타냅니다.
synchronized (outboundLock) { sslEngine.wrap(src, dst); outboundQueue.put(dst); }최종적인 패킷의 순서를 보증할 수가 없기 때문에, 결과적으로, 2 개의 thread가 같은 메소드 (
wrap()
또는 unwrap()
)를 병행해 호출할 수 없습니다.
SSLContext
,
SSLSocket
,
SSLServerSocket
,
SSLSession
,
Socket
생성자 의 개요 | |
---|---|
protected |
SSLEngine ()
내부 세션의 재사용에 관한 힌트를 제공하지 않는 SSLEngine 의 생성자 입니다. |
protected |
SSLEngine (String peerHost,
int peerPort)
SSLEngine 용 생성자 입니다. |
메소드의 개요 | |
---|---|
abstract void |
beginHandshake ()
이 SSLEngine 의 초기 핸드 쉐이크 또는 재협상의 핸드 쉐이크를 개시합니다. |
abstract void |
closeInbound ()
더 이상 이 SSLEngine 에 송신되는 착신 네트워크 데이터가 없는 것을 나타내는 신호입니다. |
abstract void |
closeOutbound ()
더 이상 이 SSLEngine 에 송신되는 송신 어플리케이션 데이터가 없는 것을 나타내는 신호입니다. |
abstract Runnable |
getDelegatedTask ()
이 SSLEngine 를 위해서(때문에) 위양 된 Runnable 태스크를 돌려줍니다. |
abstract String [] |
getEnabledCipherSuites ()
이 엔진으로 현재 사용 가능하게 되어 있는 SSL 암호화 방식군의 이름을 돌려줍니다. |
abstract String [] |
getEnabledProtocols ()
이 SSLEngine 로 현재 사용 가능하게 되어 있는 프로토콜의 버젼을 돌려줍니다. |
abstract boolean |
getEnableSessionCreation ()
이 엔진으로 새로운 SSL 세션을 확립할 수 있는 경우는 true 를 돌려줍니다. |
abstract SSLEngineResult.HandshakeStatus |
getHandshakeStatus ()
이 SSLEngine 의 현재의 핸드 쉐이크 상태를 돌려줍니다. |
abstract boolean |
getNeedClientAuth ()
이 엔진에 클라이언트 인증이 필수인경우는 true 를 돌려줍니다. |
String |
getPeerHost ()
피어의 호스트명을 돌려줍니다. |
int |
getPeerPort ()
피어의 포트 번호를 돌려줍니다. |
abstract SSLSession |
getSession ()
이 SSLEngine 로 사용중의 SSLSession 를 돌려줍니다. |
SSLParameters |
getSSLParameters ()
이 SSLEngine 로 유효한 SSLParameters 를 돌려줍니다. |
abstract String [] |
getSupportedCipherSuites ()
이 엔진으로 사용 가능하게 할 수 있는 암호화 방식군의 이름을 돌려줍니다. |
abstract String [] |
getSupportedProtocols ()
이 SSLEngine 로 사용할 수가 있는 프로토콜의 이름을 돌려줍니다. |
abstract boolean |
getUseClientMode ()
핸드 쉐이크시에 클라이언트 모드를 사용하도록(듯이) 엔진이 설정되어 있는 경우는 true |
abstract boolean |
getWantClientAuth ()
이 엔진이 클라이언트 인증을 요구하는경우는 true 를 돌려줍니다. |
abstract boolean |
isInboundDone ()
unwrap(ByteBuffer, ByteBuffer) 가 받아들이는 착신 데이터 메세지가 아직 있을지 어떨지를 돌려줍니다. |
abstract boolean |
isOutboundDone ()
wrap(ByteBuffer, ByteBuffer) 가 생성하는 송신 데이터 메세지가 아직 있을지 어떨지를 돌려줍니다. |
abstract void |
setEnabledCipherSuites (String [] suites)
이 엔진으로 사용 가능한 암호화 방식군을 설정합니다. |
abstract void |
setEnabledProtocols (String [] protocols)
이 엔진으로 사용 가능한 프로토콜의 버젼을 설정합니다. |
abstract void |
setEnableSessionCreation (boolean flag)
이 엔진으로 새로운 SSL 세션을 확립할 수 있을지 어떨지를 제어합니다. |
abstract void |
setNeedClientAuth (boolean need)
클라이언트 인증이 필수가 되는 것같게 엔진을 설정합니다. |
void |
setSSLParameters (SSLParameters params)
이 엔진에 SSLParameters 를 적용합니다. |
abstract void |
setUseClientMode (boolean mode)
핸드 쉐이크시, 엔진이 클라이언트 (또는 서버) 모드를 사용하도록(듯이) 설정합니다. |
abstract void |
setWantClientAuth (boolean want)
클라이언트 인증을 요구하도록(듯이) 엔진을 설정합니다. |
SSLEngineResult |
unwrap (ByteBuffer src,
ByteBuffer dst)
SSL/TLS 네트워크 데이터를 plaintext의 어플리케이션 데이터 버퍼에 복호화 하려고 합니다. |
SSLEngineResult |
unwrap (ByteBuffer src,
ByteBuffer [] dsts)
SSL/TLS 네트워크 데이터를 plaintext의 어플리케이션 데이터 버퍼의 순서에 복호화 하려고 합니다. |
abstract SSLEngineResult |
unwrap (ByteBuffer src,
ByteBuffer [] dsts,
int offset,
int length)
SSL/TLS 네트워크 데이터를 plaintext의 어플리케이션 데이터 버퍼의 서브 순서에 복호화 하려고 합니다. |
SSLEngineResult |
wrap (ByteBuffer [] srcs,
ByteBuffer dst)
plaintext 바이트를 데이터 버퍼 순서로부터 SSL/TLS 네트워크 데이터에 encode 하려고 합니다. |
abstract SSLEngineResult |
wrap (ByteBuffer [] srcs,
int offset,
int length,
ByteBuffer dst)
plaintext 바이트를 데이터 버퍼의 서브 순서로부터 SSL/TLS 네트워크 데이터에 encode 하려고 합니다. |
SSLEngineResult |
wrap (ByteBuffer src,
ByteBuffer dst)
plaintext의 어플리케이션 데이터의 버퍼를 SSL/TLS 네트워크 데이터에 encode 하려고 합니다. |
클래스 java.lang. Object 로부터 상속된 메소드 |
---|
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait |
생성자 의 상세 |
---|
protected SSLEngine()
SSLEngine
의 생성자 입니다.
SSLContext.createSSLEngine()
,
SSLSessionContext
protected SSLEngine(String peerHost, int peerPort)
SSLEngine
용 생성자 입니다.
SSLEngine
구현은, 내부 세션을 재사용하기 위한 힌트로서peerHost
파라미터와 peerPort
파라미터를 사용할 수 있습니다.
Kerberos 등, 원격 호스트명의 정보를 필요로 하는 암호화 방식군도 있습니다. 이 클래스의 구현은, 이 생성자 을 사용해 Kerberos 를 사용합니다.
파라미터는,SSLEngine
에 의한 인증을 받지 않습니다.
peerHost
- 피어의 호스트명peerPort
- 피어의 포트 번호SSLContext.createSSLEngine(String, int)
,
SSLSessionContext
메소드의 상세 |
---|
public String getPeerHost()
이 값은 인증되어 있지 않기 때문에, 실제로 사용할 수 없습니다.
public int getPeerPort()
이 값은 인증되어 있지 않기 때문에, 실제로 사용할 수 없습니다.
public SSLEngineResult wrap(ByteBuffer src, ByteBuffer dst) throws SSLException
이 메소드 호출의 동작은, 다음의 호출의 동작과 완전히 같습니다.
engine.wrap(new ByteBuffer [] { src }, 0, 1, dst);
src
- 송신 어플리케이션 데이터를 포함하는 ByteBuffer
dst
- 송신 네트워크 데이터를 포함하는 ByteBuffer
SSLEngineResult
SSLException
- 데이터 처리중에 발생해,SSLEngine
의 이상종료(ABEND)의 원인이 된 문제.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
ReadOnlyBufferException
- ReadOnlyBufferException dst
버퍼가 읽어내 전용의 경우
IllegalArgumentException
- IllegalArgumentException src
또는 dst
가 null 의 경우
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우wrap(ByteBuffer [], int, int, ByteBuffer)
public SSLEngineResult wrap(ByteBuffer [] srcs, ByteBuffer dst) throws SSLException
이 메소드 호출의 동작은, 다음의 호출의 동작과 완전히 같습니다.
engine.wrap(srcs, 0, srcs.length, dst);
srcs
- 송신 어플리케이션 데이터를 포함하는 ByteBuffer
의 배열dst
- 송신 네트워크 데이터를 포함하는 ByteBuffer
SSLEngineResult
SSLException
- 데이터 처리중에 발생해,SSLEngine
의 이상종료(ABEND)의 원인이 된 문제.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
ReadOnlyBufferException
- ReadOnlyBufferException dst
버퍼가 읽어내 전용의 경우
IllegalArgumentException
- IllegalArgumentException src
와 dsts
의 어느 쪽인지 한편이 null 의 경우, 또는 srcs
에 null 의 요소가 포함되는 경우
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우wrap(ByteBuffer [], int, int, ByteBuffer)
public abstract SSLEngineResult wrap(ByteBuffer [] srcs, int offset, int length, ByteBuffer dst) throws SSLException
GatheringByteChannel
, 수집 후의 동작의 자세한 것은 GatheringByteChannel.write(ByteBuffer[], int, int)
를 참조해 주세요. SSLEngine 상태에 따라서는, 이 메소드는, 어플리케이션 데이터를 일절 사용하지 않고 네트워크 데이터를 생성하는 일이 있습니다. 예를 들어, 핸드 쉐이크 데이터가 이것에 해당합니다.
어플리케이션은, 네트워크 데이터를 피어에 안전하게 전송 할 필요가 있습니다. 또, 몇회인가의 wrap()의 호출에 의해 생성된 데이터를 생성순서에 전송 할 필요가 있습니다. 어플리케이션은, 이 메소드의 복수의 호출을 올바르고 동기화할 필요가 있습니다.
이 SSLEngine
가 아직 초기 핸드 쉐이크를 개시하고 있지 않는 경우, 이 메소드에 의해 초기 핸드 쉐이크가 자동적으로 개시됩니다.
이 메소드는, 단일의 SSL/TLS 패킷을 생성하려고 해, 가능한 한 많은 소스 데이터를 소비합니다. 그러나, 각 버퍼에 남아 있는 합계 바이트수이상을 소비할 것은 없습니다. 각 ByteBuffer
의 위치는, 소비 또는 생성된 데이터량에 맞추어 갱신됩니다. 상한/하한치는 바뀌지 않습니다.
srcs
및 dst
의 ByteBuffer 는, 부하에게 있는 각각 다른 메모리를 사용할 필요가 있습니다.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
srcs
- 송신 어플리케이션 데이터를 포함하는 ByteBuffer
의 배열offset
- offset 최초의 바이트의 취득처가 되는 버퍼 배열내의 오프셋(offset).
srcs.length
이하의 제로 또는 정의 수length
- length 액세스 가능한 최대 버퍼수.
srcs.length
- offset
이하의 제로 또는 정의 수dst
- 송신 네트워크 데이터를 포함하는 ByteBuffer
SSLEngineResult
SSLException
- 데이터 처리중에 발생해,SSLEngine
의 이상종료(ABEND)의 원인이 된 문제.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
IndexOutOfBoundsException
- IndexOutOfBoundsException offset
파라미터와 length
파라미터의 전제 조건이 채워지지 않은 경우
ReadOnlyBufferException
- ReadOnlyBufferException dst
버퍼가 읽어내 전용의 경우
IllegalArgumentException
- IllegalArgumentException srcs
와 dst
의 어느 쪽인지 한편이 null 의 경우, 또는 지정된 srcs
서브 순서에 null 의 요소가 포함되는 경우
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우GatheringByteChannel
,
java.nio.channels.GatheringByteChannel#write(
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst) throws SSLException
이 메소드 호출의 동작은, 다음의 호출의 동작과 완전히 같습니다.
engine.unwrap(src, new ByteBuffer [] { dst }, 0, 1);
src
- 착신 네트워크 데이터를 포함하는 ByteBuffer
dst
- 착신 어플리케이션 데이터를 포함하는 ByteBuffer
SSLEngineResult
SSLException
- 데이터 처리중에 발생해,SSLEngine
의 이상종료(ABEND)의 원인이 된 문제.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
ReadOnlyBufferException
- ReadOnlyBufferException dst
버퍼가 읽어내 전용의 경우
IllegalArgumentException
- IllegalArgumentException src
또는 dst
가 null 의 경우
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우unwrap(ByteBuffer, ByteBuffer [], int, int)
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer [] dsts) throws SSLException
이 메소드 호출의 동작은, 다음의 호출의 동작과 완전히 같습니다.
engine.unwrap(src, dsts, 0, dsts.length);
src
- 착신 네트워크 데이터를 포함하는 ByteBuffer
dsts
- 착신 어플리케이션 데이터를 포함하는 ByteBuffer
의 배열
SSLEngineResult
SSLException
- 데이터 처리중에 발생해,SSLEngine
의 이상종료(ABEND)의 원인이 된 문제.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
ReadOnlyBufferException
- ReadOnlyBufferException 읽기 전용의 dst
버퍼가 존재하는 경우
IllegalArgumentException
- IllegalArgumentException srcs
와 dst
의 어느 쪽인지 한편이 null 의 경우, 또는 dsts
에 null 의 요소가 포함되는 경우
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우unwrap(ByteBuffer, ByteBuffer [], int, int)
public abstract SSLEngineResult unwrap(ByteBuffer src, ByteBuffer [] dsts, int offset, int length) throws SSLException
ScatteringByteChannel
, 살포 후의 동작의 자세한 것은 ScatteringByteChannel.read(ByteBuffer[], int, int)
를 참조해 주세요. SSLEngine 상태에 따라서는, 이 메소드는, 어플리케이션 데이터를 일절 생성하지 않고 네트워크 데이터를 사용하는 일이 있습니다. 예를 들어, 핸드 쉐이크 데이터가 이것에 해당합니다.
어플리케이션은, 피어로부터 네트워크 데이터를 안전하게 취득할 필요가 있습니다. 또, 수신한 순서에 데이터의 랩을 해제 (unwrap() 호출) 할 필요가 있습니다. 어플리케이션은, 이 메소드의 복수의 호출을 올바르고 동기화할 필요가 있습니다.
이 SSLEngine
가 아직 초기 핸드 쉐이크를 개시하고 있지 않는 경우, 이 메소드에 의해 초기 핸드 쉐이크가 자동적으로 개시됩니다.
이 메소드는, 단일의 완전한 SSL/TLS 네트워크 패킷을 소비하려고 합니다만, 버퍼에 남아 있는 합계 바이트수이상을 소비할 것은 없습니다. 각 ByteBuffer
의 위치는, 소비 또는 생성된 데이터량에 맞추어 갱신됩니다. 상한/하한치는 바뀌지 않습니다.
src
및 dsts
의 ByteBuffer 는, 부하에게 있는 각각 다른 메모리를 사용할 필요가 있습니다.
이 호출의 결과, 착신 네트워크버퍼-가 변경되는 일이 있습니다. 이 때문에, 이차적인 목적으로 네트워크 데이터 패킷이 필요한 경우는, 이 메소드의 호출전에 데이터를 복제할 필요가 있습니다. 주:네트워크 데이터를 2 번째의 SSLEngine 로 사용할 수 없습니다. 각 SSLEngine 가, SSL/TLS 메세지에 영향을 미치는 일의의 랜덤인 상태를 가지고 있기 때문입니다.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
src
- 착신 네트워크 데이터를 포함하는 ByteBuffer
dsts
- 착신 어플리케이션 데이터를 포함하는 ByteBuffer
의 배열offset
- 최초의 바이트의 전송처가 되는 버퍼 배열내의 오프셋(offset). dsts.length
이하의 제로 또는 정의 수length
- length 액세스 가능한 최대 버퍼수.
dsts.length
- offset
이하의 제로 또는 정의 수
SSLEngineResult
SSLException
- 데이터 처리중에 발생해,SSLEngine
의 이상종료(ABEND)의 원인이 된 문제.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
IndexOutOfBoundsException
- IndexOutOfBoundsException offset
파라미터와 length
파라미터의 전제 조건이 채워지지 않은 경우
ReadOnlyBufferException
- ReadOnlyBufferException 읽기 전용의 dst
버퍼가 존재하는 경우
IllegalArgumentException
- IllegalArgumentException src
와 dsts
의 어느 쪽인지 한편이 null 의 경우, 또는 지정된 dsts
서브 순서에 null 의 요소가 포함되는 경우
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우ScatteringByteChannel
,
java.nio.channels.ScatteringByteChannel#read(
public abstract Runnable getDelegatedTask()
SSLEngine
를 위해서(때문에) 위양 된 Runnable
태스크를 돌려줍니다.
SSLEngine
오퍼레이션에 필요한 오퍼레이션의 결과가 블록 되거나 완료까지 상당한 시간이 걸리는 일이 있습니다. 이 메소드는, 미처리 Runnable
오퍼레이션 (태스크)을 취득하기 위해서 사용됩니다. 각 태스크에는,run
오퍼레이션을 실행하는 thread (현재의 thread도 가능)를 할당할 필요가 있습니다. run
메소드가 종료한 뒤, 불필요하게 된 Runnable
객체는 폐기 가능합니다.
위양 된 태스크는,AccessControlContext
내에서, 이 객체가 작성되었을 때에 실행됩니다.
이 메소드의 호출은, 미처리의 태스크를 각각 1 회만 돌려줍니다.
위양 된 복수의 태스크를 병렬 실행할 수도 있습니다.
Runnable
태스크.
사용할 수 있는 것이 없는 경우는 nullpublic abstract void closeInbound() throws SSLException
SSLEngine
에 송신되는 착신 네트워크 데이터가 없는 것을 나타내는 신호입니다.
어플리케이션이 closeOutbound()
를 호출해 종료 처리를 개시했을 때, 피어의 대응하는 종료 메세지를 기다릴 필요가 없는 경우가 있습니다 (종료의 경고의 대기에 관한 자세한 것은, TLS 스펙의 섹션 7.2. 1(RFC 2246 )을 참조). 이 경우, 이 메소드의 호출은 불필요합니다.
이것에 대해서, 어플리케이션이 종료 처리를 개시하지 않았던 경우나, 상기의 상황에 들어맞지 않는 경우는, SSL/TLS 데이터 스트림의 종료 부분이 착신할 때마다 이 메소드를 호출할 필요가 있습니다. 이것에 의해, 착신측의 종료가 보증되어 피어가 SSL/TLS 종료 수속을 적절히 실행한 것을 확인해, 값의 절약해에 의한 공격의 가능성을 검출할 수가 있습니다.
이 메소드는, 나무등입니다. 착신측이 벌써 종료하고 있는 경우는, 아무것도 실시하지 않습니다.
나머지의 핸드 쉐이크 데이터를 플래시 하려면 ,wrap()
를 호출합니다.
SSLException
- SSLException 이 엔진이 피어로부터 적절한 SSL/TLS 종료 통지 메세지를 받아들이지 않은 경우isInboundDone()
,
isOutboundDone()
public abstract boolean isInboundDone()
unwrap(ByteBuffer, ByteBuffer)
가 받아들이는 착신 데이터 메세지가 아직 있을지 어떨지를 돌려줍니다.
SSLEngine
가 더 이상 네트워크 데이터를 사용하지 않는 경우 (바꾸어 말하면, 더 이상 어플리케이션 데이터를 생성하지 않는 경우)는 truecloseInbound()
public abstract void closeOutbound()
SSLEngine
에 송신되는 송신 어플리케이션 데이터가 없는 것을 나타내는 신호입니다. 이 메소드는, 나무등입니다. 송신측이 벌써 종료하고 있는 경우는, 아무것도 실시하지 않습니다.
나머지의 핸드 쉐이크 데이터를 플래시 하려면 ,wrap(ByteBuffer, ByteBuffer)
를 호출합니다.
isOutboundDone()
public abstract boolean isOutboundDone()
wrap(ByteBuffer, ByteBuffer)
가 생성하는 송신 데이터 메세지가 아직 있을지 어떨지를 돌려줍니다.
종료 단계에서,SSLEngine
는, 피어에 송신하는 핸드 쉐이크 종료 데이터를 생성합니다. 이 데이터를 생성하려면 ,wrap()
를 호출할 필요가 있습니다. 이 메소드의 반환값이 true 의 경우, 더 이상 송신 데이터는 생성되지 않습니다.
SSLEngine
가 더 이상 네트워크 데이터를 생성하지 않는 경우는 truecloseOutbound()
,
closeInbound()
public abstract String [] getSupportedCipherSuites()
getEnabledCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract String [] getEnabledCipherSuites()
암호화 방식군은, 비록 유효해도 사용되지 않는 것이 있습니다. 예를 들어, 피어가 암호화 방식군을 지원하지 않는 경우, 이 encode에 필요한 증명서나 비공개키를 사용할 수가 없는 경우, 또는, 익명의 암호화 방식군이 이용 가능해도 인증이 요구되는 경우 등입니다.
getSupportedCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract void setEnabledCipherSuites(String [] suites)
suites
파라미터로 지정된 각 암호화 방식군은, getSupportedCipherSuites()로 리스트되어 있지 않으면 안됩니다. 그렇지 않은 경우, 메소드는 실패합니다. 이 메소드의 호출이 정상적으로 행해졌을 때,suites
파라미터에 리스트 된 암호화 방식군만, 사용할 수가 있습니다.
왜 특정의 암호화 방식군을 엔진으로 사용할 수가 없는 것처럼 붙어서는,getEnabledCipherSuites()
를 참조해 주세요.
suites
- 사용 가능하게 하는 모든 암호화 방식군의 이름
IllegalArgumentException
- 파라미터로 지정된 암호화 방식군의 일부가 지원되지 않는 경우, 또는 파라미터가 null 의 경우. getSupportedCipherSuites()
,
getEnabledCipherSuites()
public abstract String [] getSupportedProtocols()
SSLEngine
로 사용할 수가 있는 프로토콜의 이름을 돌려줍니다.
public abstract String [] getEnabledProtocols()
SSLEngine
로 현재 사용 가능하게 되어 있는 프로토콜의 버젼을 돌려줍니다.
setEnabledProtocols(String [])
public abstract void setEnabledProtocols(String [] protocols)
프로토콜은, getSupportedProtocols()에 의해, 지원 대상으로 해 리스트되어 있지 않으면 안됩니다. 이 메소드의 호출이 정상적으로 행해졌을 때,protocols
파라미터에 리스트 된 프로토콜만, 사용할 수가 있습니다.
protocols
- 사용 가능하게 하는 모든 프로토콜의 이름
IllegalArgumentException
- 파라미터로 지정된 프로토콜의 일부가 지원되지 않는 경우, 또는 파라미터가 null 의 경우. getEnabledProtocols()
public abstract SSLSession getSession()
SSLEngine
로 사용중의 SSLSession
를 돌려줍니다. SSL 세션은 유효기간이 길고, 사용자에 따라서는 로그인 세션 전체에 대응하는 일도 있습니다. 세션에는, 세션내의 모든 접속으로 사용되는 암호화 방식군과 세션의 클라이언트와 서버의 식별 정보가 지정되고 있습니다.
이 메소드는,SSLSocket.getSession()
과는 달리, 핸드 쉐이크가 완료할 때까지 블록 되지 않습니다.
초기 핸드 쉐이크가 완료하면(자), 무효인 암호화 방식군 SSL_NULL_WITH_NULL_NULL 를 보고하는 세션 객체를 돌려줍니다.
SSLEngine
의 SSLSession
SSLSession
public abstract void beginHandshake() throws SSLException
이 메소드는, 초기 핸드 쉐이크시에는 필요 없습니다. 핸드 쉐이크가 아직 개시되어 있지 않은 경우는,wrap()
메소드와 unwrap()
메소드에 의해 암묵적으로 이 메소드가 불려 가기 때문입니다.
피어도, 적절한 세션재협상의 핸드 쉐이크 메세지를 송신하는 것으로써, 이 SSLEngine
와의 세션의 재협상을 요구하는 일이 있습니다.
이 메소드는,SSLSocket#startHandshake()
메소드와는 달라, 핸드 쉐이크가 완료할 때까지 블록 되지 않습니다.
강제적으로 SSL/TLS 세션의 재협상을 실시하는 경우는, 현재의 세션을 무효로 하고 나서 이 메소드를 호출할 필요가 있습니다.
기존의 엔진상에서 복수의 핸드 쉐이크를 지원하지 않고,SSLException
를 throw 하는 프로토콜도 있습니다.
SSLException
- SSLException SSLEngine
에 새롭고 핸드 쉐이크를 개시하도록(듯이) 통지하고 있을 때, 문제가 발생했을 경우.
엔진의 종료의 자세한 것은, 클래스의 설명을 참조
IllegalStateException
- IllegalStateException 클라이언트/서버 모드가 미설정의 경우SSLSession.invalidate()
public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()
SSLEngine
의 현재의 핸드 쉐이크 상태를 돌려줍니다.
SSLEngineResult.HandshakeStatus
public abstract void setUseClientMode(boolean mode)
이 메소드는, 모든 핸드 쉐이크의 전에 호출할 필요가 있습니다. 일단 핸드 쉐이크가 개시되면(자), 이 엔진의 수명이 다할 때까지, 현재의 모드를 리셋 할 수 없습니다.
일반적으로, 서버는 자신을 인증합니다만, 클라이언트는 반드시 그렇다고는 할 수 없습니다.
mode
- mode 핸드 쉐이크를 클라이언트 모드로 개시하는 경우는 true
IllegalArgumentException
- 최초의 핸드 쉐이크가 개시되고 나서 모드를 변경하려고 했을 경우. getUseClientMode()
public abstract boolean getUseClientMode()
setUseClientMode(boolean)
public abstract void setNeedClientAuth(boolean need)
엔진의 클라이언트 인증 설정은, 다음의 어느 쪽인가에 됩니다.
setWantClientAuth(boolean)
의 경우와는 달라, 이 옵션이 설정되어 있어, 한편 클라이언트 인증 정보가 제공되지 않는 경우는, 협상이 정지해, 엔진은, 종료 프로시저를 개시합니다.
이 메소드를 호출하면(자), 지금까지 이 메소드 또는 setWantClientAuth(boolean)
에 의해 설정된 내용이 오버라이드(override) 됩니다.
need
- 클라이언트 인증이 필수의 경우는 true, 클라이언트 인증이 불필요한 경우는 false. getNeedClientAuth()
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getNeedClientAuth()
setNeedClientAuth(boolean)
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract void setWantClientAuth(boolean want)
엔진의 클라이언트 인증 설정은, 다음의 어느 쪽인가에 됩니다.
setNeedClientAuth(boolean)
와 달리, 이 옵션이 설정되어 있어, 한편 클라이언트 인증 정보가 제공되지 않는 경우에서도, 협상은 속행됩니다.
이 메소드를 호출하면(자), 지금까지 이 메소드 또는 setNeedClientAuth(boolean)
에 의해 설정된 내용이 오버라이드(override) 됩니다.
want
- 클라이언트 인증이 요구되었을 경우는 true, 클라이언트 인증이 불필요한 경우는 false. getWantClientAuth()
,
setNeedClientAuth(boolean)
,
getNeedClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getWantClientAuth()
setNeedClientAuth(boolean)
,
getNeedClientAuth()
,
setWantClientAuth(boolean)
,
setUseClientMode(boolean)
public abstract void setEnableSessionCreation(boolean flag)
flag
- 세션을 작성할 수 있는 경우는 true (디폴트).
기존의 세션을 재개하는 경우는 falsegetEnableSessionCreation()
public abstract boolean getEnableSessionCreation()
setEnableSessionCreation(boolean)
public SSLParameters getSSLParameters()
public void setSSLParameters(SSLParameters params)
이것은 다음 일을 의미합니다.
params.getCipherSuites()
가 null 이외의 경우, 그 값을 사용해 setEnabledCipherSuites()
가 불려 간다
params.getProtocols()
가 null 이외의 경우, 그 값을 사용해 setEnabledProtocols()
가 불려 간다
params.getNeedClientAuth()
또는 params.getWantClientAuth()
가 true
를 돌려주는 경우, 각각 setNeedClientAuth(true)
또는 setWantClientAuth(true)
가 불려 간다. 그렇지 않은 경우,setWantClientAuth(false)
가 불려 간다.
params
- 파라미터
IllegalArgumentException
- setEnabledCipherSuites() 또는 the setEnabledProtocols()의 호출해에 실패했을 경우
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.