Spec-Zone .ru
спецификации, руководства, описания, API
|
public abstract class SSLEngine extends Object
Безопасные коммуникационные режимы включают:
Используемый комплект шифра устанавливается процессом согласования, вызванным, "квитируя". Цель этого процесса состоит в том, чтобы создать или воссоединиться с "сеансом", который может защитить много соединений в течение долгого времени. После того, как квитирование завершилось, можно получить доступ к атрибутам сеанса при использовании getSession()
метод.
SSLSocket
класс обеспечивает большую часть той же самой функциональности безопасности, но все входящие и исходящие данные автоматически транспортируются, используя базовое Socket
, который проектом использует модель блокирования. В то время как это является подходящим для многих приложений, эта модель не обеспечивает масштабируемость, требуемую большими серверами.
Основное различие SSLEngine
это, это работает на входящих и исходящих потоках байтов, независимых от транспортного механизма. Это - ответственность SSLEngine
пользователь, чтобы устроить надежный ввод-вывод транспортирует к коллеге. Разделяя абстракцию SSL/TLS от ввода-вывода транспортируют механизм, SSLEngine
может использоваться для большого разнообразия типов ввода-вывода, такой как non-blocking I/O (polling)
, selectable non-blocking I/O
, Socket
и традиционный Input/OutputStreams, локальный ByteBuffers
или байтовые массивы,
На высоком уровне, SSLEngine
появляется таким образом:
app data | ^ | | | v | | +----+-----|-----+----+ | | | | SSL|Engine | wrap() | | | unwrap() | OUTBOUND | INBOUND | | | | +----+-----|-----+----+ | | ^ | | | v | net dataДанные приложения (также известный как простой текст или открытый текст) являются данными, которые производятся или используются приложением. Его дубликат является сетевыми данными, которые состоят из любого квитирования и/или шифрованного текста (зашифрованные) данные, и предназначенный, чтобы быть транспортированными через механизм ввода-вывода. Входящие данные являются данными, которые были получены от коллеги, и исходящие данные предназначаются для коллеги.
(В контексте SSLEngine
, термин "квитирование данных" берется, чтобы означать любые данные, переданные, чтобы установить и управлять безопасным соединением. Данные квитирования включают сообщения SSL/TLS "предупреждение", "change_cipher_spec", и "квитирование".)
Есть пять отличных фаз к SSLEngine
.
SSLEngine
был создан и инициализирован, но еще не использовался. Во время этой фазы приложение может установить любого SSLEngine
Специфичные настройки (включал комплектам шифра, ли SSLEngine
должен квитировать в клиенте или режиме сервера, и так далее). Как только квитирование начало, тем не менее, любые новые настройки (кроме клиент-серверного режима, см. ниже), будет использоваться для следующего квитирования. SSLEngine
. Исходящие сообщения приложения шифруются и целостность, защищенные, и входящие сообщения инвертируют процесс. SSLEngine
параметры конфигурации не будут использоваться до следующего квитирования. SSLEngine
и должен отправить/получить любые остающиеся сообщения коллеге прежде, чем закрыть базовый транспортный механизм. Как только механизм закрывается, это не допускающее повторное использование: новое SSLEngine
должен быть создан. SSLEngine
создается, вызывая SSLContext.createSSLEngine()
от инициализированного SSLContext
. Любые параметры конфигурации должны быть установлены прежде, чем сделать первый звонок wrap()
, unwrap()
, или beginHandshake()
. Эти методы весь триггер начальное квитирование. Данные перемещаются через механизм, вызывая wrap()
или unwrap()
на исходящих или входящих данных, соответственно. В зависимости от состояния SSLEngine
, a wrap()
вызов может использовать данные приложения от исходного буфера и может произвести сетевые данные в целевом буфере. Исходящие данные могут содержать приложение и/или квитировать данные. Звонок unwrap()
исследует исходный буфер и может усовершенствовать квитирование, если данные будут квитировать информацию, или смогут поместить данные приложения в целевой буфер, если данные являются приложением. Состояние базового алгоритма SSL/TLS определит, когда данные будут использованы и производятся.
Звонки wrap()
и unwrap()
возвратитесь SSLEngineResult
который указывает на состояние работы, и (дополнительно) как взаимодействовать с механизмом, чтобы сделать успехи.
SSLEngine
производит/использует полные пакеты SSL/TLS только, и не хранит данные приложения внутренне между звонками wrap()/unwrap()
. Таким образом вход и выход ByteBuffer
s должен быть измерен соответственно, чтобы содержать максимальную запись, которая может быть произведена. Звонки SSLSession.getPacketBufferSize()
и SSLSession.getApplicationBufferSize()
должен использоваться, чтобы определить соответствующие буферные размеры. Размер исходящего буфера данных приложения обычно не имеет значения. Если буферные условия не учитывают надлежащее потребление/производство данных, приложение должно определить (через SSLEngineResult
) и исправьте проблему, и затем попробуйте вызов снова.
Например, unwrap()
возвратит a SSLEngineResult.Status.BUFFER_OVERFLOW
закончитесь, если механизм решает, что есть недостаточное целевое доступное пространство буфера. Приложения должны вызвать SSLSession.getApplicationBufferSize()
и сравните то значение с пространством, доступным в целевом буфере, увеличивая буфер в случае необходимости. Точно так же, если unwrap()
должны были возвратить a 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
создаст a Runnable
делегированная задача. Когда SSLEngineResult
указывает, что делегированный результат задачи необходим, приложение должно вызвать getDelegatedTask()
получить выдающуюся делегированную задачу и вызвать run()
метод (возможно использующий различный поток в зависимости от вычислить стратегии). Приложение должно продолжать получать делегированные задачи, пока больше не существуют, и пробуют исходную работу снова.
В конце коммуникационного сеанса приложения должны должным образом закрыть ссылку SSL/TLS. У протоколов SSL/TLS есть сообщения квитирования закрытия, и эти сообщения должны быть переданы к коллеге прежде, чем выпустить SSLEngine
и закрытие базового транспортного механизма. Завершение может инициироваться одним из: SSLException, входящее сообщение квитирования закрытия, или один из близких методов. Во всех случаях сообщения квитирования закрытия сгенерированы механизмом, и wrap()
должен неоднократно вызываться до получающегося SSLEngineResult
's возвраты состояния "ЗАКРЫЛСЯ", или isOutboundDone()
возвращает true. Все данные, полученные из wrap()
метод должен быть отправлен коллеге.
closeOutbound()
используется, чтобы сигнализировать механизм, что приложение не будет отправлять больше данные.
Коллега будет сигнализировать свое намерение к рядом с отправкой ее собственного сообщения квитирования закрытия. После того, как это сообщение было получено и обработано локальной переменной SSLEngine
's unwrap()
вызовите, приложение может обнаружить рядом с вызовом unwrap()
и поиск a SSLEngineResult
с состоянием, "ЗАКРЫТЫМ", или если isInboundDone()
возвращает true. Если по некоторым причинам коллега закрывает линию связи, не отправляя надлежащее сообщение закрытия SSL/TLS, приложение может обнаружить конец потока и может сигнализировать механизм через closeInbound()
то, что там больше не будет входящих сообщений, чтобы обработать. Некоторые приложения могли бы хотеть требовать аккуратных сообщений завершения работы от коллеги, когда они могут проверить, что закрытие было сгенерировано сообщением квитирования а не условием конца потока.
Есть две группы комплектов шифра, о которых Вы должны будете знать, управляя комплектами шифра:
getSupportedCipherSuites()
. setEnabledCipherSuites(String [])
метод, и запрошенное использование getEnabledCipherSuites()
метод. Первоначально, набор по умолчанию комплектов шифра будет включен на новом механизме, который представляет минимальную предложенную конфигурацию. У каждого соединения SSL/TLS должны быть один клиент и один сервер, таким образом каждая конечная точка должна решить который роль принять. Этот выбор определяет, кто начинает процесс квитирования так же как какой тип сообщений должен быть отправлен каждой стороной. Метод setUseClientMode(boolean)
конфигурирует режим. Как только начальное квитирование запустилось, SSLEngine
не может переключиться между режимами клиента и сервера, выполняя пересмотры.
Приложения могли бы хотеть обрабатывать делегированные задачи в различных потоках. Когда SSLEngine
создается, ток AccessControlContext
сохраняется. Все будущее делегированные задачи будет обработано, используя этот контекст: то есть, все решения управления доступом будут приняты, используя контекст, полученный при создании механизма.
wrap()
и unwrap()
методы могут выполниться одновременно друг друга. Например:
synchronized (outboundLock) { sslEngine.wrap(src, dst); outboundQueue.put(dst); }Как заключение, два потока не должны попытаться вызвать тот же самый метод (также
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()
Возвращает делегированный
Runnable задача для этого SSLEngine . |
abstract String[] |
getEnabledCipherSuites()
Возвращает имена комплектов шифра SSL, которые в настоящий момент включаются для использования на этом механизме.
|
abstract String[] |
getEnabledProtocols()
Возвращает имена версий протокола, которые в настоящий момент включаются для использования с этим
SSLEngine . |
abstract boolean |
getEnableSessionCreation()
Возвращает true, если новые сеансы SSL могут быть установлены этим механизмом.
|
SSLSession |
getHandshakeSession()
Возвраты
SSLSession будучи созданным во время квитирования SSL/TLS. |
abstract SSLEngineResult.HandshakeStatus |
getHandshakeStatus()
Возвращает текущее состояние квитирования для этого
SSLEngine . |
abstract boolean |
getNeedClientAuth()
Возвращает true, если механизм потребует аутентификации клиента.
|
Строка |
getPeerHost()
Возвращает имя хоста коллеги.
|
int |
getPeerPort()
Возвращает номер порта коллеги.
|
abstract SSLSession |
getSession()
Возвраты
SSLSession в использовании в этом SSLEngine . |
SSLParameters |
getSSLParameters()
Возвращает SSLParameters в действительности для этого SSLEngine.
|
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 в буфер данных приложения простого текста.
|
SSLEngineResult |
unwrap(ByteBuffer src, ByteBuffer[] dsts)
Попытки декодировать данные сети SSL/TLS в последовательность буферов данных приложения простого текста.
|
abstract SSLEngineResult |
unwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length)
Попытки декодировать данные сети SSL/TLS в подпоследовательность буферов данных приложения простого текста.
|
SSLEngineResult |
wrap(ByteBuffer[] srcs, ByteBuffer dst)
Попытки закодировать байты простого текста от последовательности буферов данных в данные сети SSL/TLS.
|
abstract SSLEngineResult |
wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst)
Попытки закодировать байты простого текста от подпоследовательности буферов данных в данные сети SSL/TLS.
|
SSLEngineResult |
wrap(ByteBuffer src, ByteBuffer dst)
Попытки закодировать буфер данных приложения простого текста в данные сети SSL/TLS.
|
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
- a ByteBuffer
containing outbound application datadst
- a ByteBuffer
to hold outbound network dataSSLEngineResult
describing the result
of this operation.SSLException
- A problem was encountered while processing the
data that caused the SSLEngine
to abort.
See the class description for more information on
engine closure.ReadOnlyBufferException
- if the dst
buffer is read-only.IllegalArgumentException
- if either src
or dst
is null.IllegalStateException
- if the client/server mode
has not yet been set.wrap(ByteBuffer [], int, int, ByteBuffer)
public SSLEngineResult wrap(ByteBuffer[] srcs, ByteBuffer dst) throws SSLException
An invocation of this method behaves in exactly the same manner as the invocation:
engine.wrap(srcs, 0, srcs.length, dst);
srcs
- an array of ByteBuffers
containing the
outbound application datadst
- a ByteBuffer
to hold outbound network dataSSLEngineResult
describing the result
of this operation.SSLException
- A problem was encountered while processing the
data that caused the SSLEngine
to abort.
See the class description for more information on
engine closure.ReadOnlyBufferException
- if the dst
buffer is read-only.IllegalArgumentException
- if either srcs
or dst
is null, or if any element in srcs
is null.IllegalStateException
- if the client/server mode
has not yet been set.wrap(ByteBuffer [], int, int, ByteBuffer)
public abstract SSLEngineResult wrap(ByteBuffer[] srcs, int offset, int length, ByteBuffer dst) throws SSLException
GatheringByteChannel
for more
information on gathering, and GatheringByteChannel.write(ByteBuffer[],
int, int)
for more information on the subsequence
behavior.
Depending on the state of the SSLEngine, this method may produce network data without consuming any application data (for example, it may generate handshake data.)
The application is responsible for reliably transporting the network data to the peer, and for ensuring that data created by multiple calls to wrap() is transported in the same order in which it was generated. The application must properly synchronize multiple calls to this method.
If this SSLEngine
has not yet started its initial
handshake, this method will automatically start the handshake.
This method will attempt to produce one SSL/TLS packet, and will
consume as much source data as possible, but will never consume
more than the sum of the bytes remaining in each buffer. Each
ByteBuffer
's position is updated to reflect the
amount of data consumed or produced. The limits remain the
same.
The underlying memory used by the srcs
and
dst ByteBuffer
s must not be the same.
See the class description for more information on engine closure.
srcs
- an array of ByteBuffers
containing the
outbound application dataoffset
- The offset within the buffer array of the first buffer from
which bytes are to be retrieved; it must be non-negative
and no larger than srcs.length
length
- The maximum number of buffers to be accessed; it must be
non-negative and no larger than
srcs.length
- offset
dst
- a ByteBuffer
to hold outbound network dataSSLEngineResult
describing the result
of this operation.SSLException
- A problem was encountered while processing the
data that caused the SSLEngine
to abort.
See the class description for more information on
engine closure.IndexOutOfBoundsException
- if the preconditions on the offset
and
length
parameters do not hold.ReadOnlyBufferException
- if the dst
buffer is read-only.IllegalArgumentException
- if either srcs
or dst
is null, or if any element in the srcs
subsequence specified is null.IllegalStateException
- if the client/server mode
has not yet been set.GatheringByteChannel
,
GatheringByteChannel.write(
ByteBuffer[], int, int)
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer dst) throws SSLException
An invocation of this method behaves in exactly the same manner as the invocation:
engine.unwrap(src, new ByteBuffer [] { dst }, 0, 1);
src
- a ByteBuffer
containing inbound network data.dst
- a ByteBuffer
to hold inbound application data.SSLEngineResult
describing the result
of this operation.SSLException
- A problem was encountered while processing the
data that caused the SSLEngine
to abort.
See the class description for more information on
engine closure.ReadOnlyBufferException
- if the dst
buffer is read-only.IllegalArgumentException
- if either src
or dst
is null.IllegalStateException
- if the client/server mode
has not yet been set.unwrap(ByteBuffer, ByteBuffer [], int, int)
public SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts) throws SSLException
An invocation of this method behaves in exactly the same manner as the invocation:
engine.unwrap(src, dsts, 0, dsts.length);
src
- a ByteBuffer
containing inbound network data.dsts
- an array of ByteBuffer
s to hold inbound
application data.SSLEngineResult
describing the result
of this operation.SSLException
- A problem was encountered while processing the
data that caused the SSLEngine
to abort.
See the class description for more information on
engine closure.ReadOnlyBufferException
- if any of the dst
buffers are read-only.IllegalArgumentException
- if either src
or dsts
is null, or if any element in dsts
is null.IllegalStateException
- if the client/server mode
has not yet been set.unwrap(ByteBuffer, ByteBuffer [], int, int)
public abstract SSLEngineResult unwrap(ByteBuffer src, ByteBuffer[] dsts, int offset, int length) throws SSLException
ScatteringByteChannel
for more
information on scattering, and ScatteringByteChannel.read(ByteBuffer[],
int, int)
for more information on the subsequence
behavior.
Depending on the state of the SSLEngine, this method may consume network data without producing any application data (for example, it may consume handshake data.)
The application is responsible for reliably obtaining the network data from the peer, and for invoking unwrap() on the data in the order it was received. The application must properly synchronize multiple calls to this method.
If this SSLEngine
has not yet started its initial
handshake, this method will automatically start the handshake.
This method will attempt to consume one complete SSL/TLS network
packet, but will never consume more than the sum of the bytes
remaining in the buffers. Each ByteBuffer
's
position is updated to reflect the amount of data consumed or
produced. The limits remain the same.
The underlying memory used by the src
and
dsts ByteBuffer
s must not be the same.
The inbound network buffer may be modified as a result of this call: therefore if the network data packet is required for some secondary purpose, the data should be duplicated before calling this method. Note: the network data will not be useful to a second SSLEngine, as each SSLEngine contains unique random state which influences the SSL/TLS messages.
See the class description for more information on engine closure.
src
- a ByteBuffer
containing inbound network data.dsts
- an array of ByteBuffer
s to hold inbound
application data.offset
- The offset within the buffer array of the first buffer from
which bytes are to be transferred; it must be non-negative
and no larger than dsts.length
.length
- The maximum number of buffers to be accessed; it must be
non-negative and no larger than
dsts.length
- offset
.SSLEngineResult
describing the result
of this operation.SSLException
- A problem was encountered while processing the
data that caused the SSLEngine
to abort.
See the class description for more information on
engine closure.IndexOutOfBoundsException
- If the preconditions on the offset
and
length
parameters do not hold.ReadOnlyBufferException
- if any of the dst
buffers are read-only.IllegalArgumentException
- if either src
or dsts
is null, or if any element in the dsts
subsequence specified is null.IllegalStateException
- if the client/server mode
has not yet been set.ScatteringByteChannel
,
ScatteringByteChannel.read(
ByteBuffer[], int, int)
public abstract Runnable getDelegatedTask()
Runnable
task for
this SSLEngine
.
SSLEngine
operations may require the results of
operations that block, or may take an extended period of time to
complete. This method is used to obtain an outstanding Runnable
operation (task). Each task must be assigned
a thread (possibly the current) to perform the run
operation. Once the
run
method returns, the Runnable
object
is no longer needed and may be discarded.
Delegated tasks run in the AccessControlContext
in place when this object was created.
A call to this method will return each outstanding task exactly once.
Multiple delegated tasks can be run in parallel.
Runnable
task, or null
if none are available.public abstract void closeInbound() throws SSLException
SSLEngine
.
If the application initiated the closing process by calling
closeOutbound()
, under some circumstances it is not
required that the initiator wait for the peer's corresponding
close message. (See section 7.2.1 of the TLS specification (
But if the application did not initiate the closure process, or if the circumstances above do not apply, this method should be called whenever the end of the SSL/TLS data stream is reached. This ensures closure of the inbound side, and checks that the peer followed the SSL/TLS close procedure properly, thus detecting possible truncation attacks.
This method is idempotent: if the inbound side has already been closed, this method does not do anything.
wrap()
should be
called to flush any remaining handshake data.
SSLException
- if this engine has not received the proper SSL/TLS close
notification message from the peer.isInboundDone()
,
isOutboundDone()
public abstract boolean isInboundDone()
unwrap(ByteBuffer, ByteBuffer)
will
accept any more inbound data messages.SSLEngine
will not
consume anymore network data (and by implication,
will not produce any more application data.)closeInbound()
public abstract void closeOutbound()
SSLEngine
.
This method is idempotent: if the outbound side has already been closed, this method does not do anything.
wrap(ByteBuffer, ByteBuffer)
should be
called to flush any remaining handshake data.
isOutboundDone()
public abstract boolean isOutboundDone()
wrap(ByteBuffer, ByteBuffer)
will
produce any more outbound data messages.
Note that during the closure phase, a SSLEngine
may
generate handshake closure data that must be sent to the peer.
wrap()
must be called to generate this data. When
this method returns true, no more outbound data will be created.
SSLEngine
will not produce
any more network datacloseOutbound()
,
closeInbound()
public abstract String[] getSupportedCipherSuites()
getEnabledCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract String[] getEnabledCipherSuites()
Even if a suite has been enabled, it might never be used. (For example, the peer does not support it, the requisite certificates/private keys for the suite are not available, or an anonymous suite is enabled but authentication is required.)
getSupportedCipherSuites()
,
setEnabledCipherSuites(String [])
public abstract void setEnabledCipherSuites(String[] suites)
Each cipher suite in the suites
parameter must have
been listed by getSupportedCipherSuites(), or the method will
fail. Following a successful call to this method, only suites
listed in the suites
parameter are enabled for use.
See getEnabledCipherSuites()
for more information
on why a specific cipher suite may never be used on a engine.
suites
- Names of all the cipher suites to enableIllegalArgumentException
- when one or more of the ciphers
named by the parameter is not supported, or when the
parameter is null.getSupportedCipherSuites()
,
getEnabledCipherSuites()
public abstract String[] getSupportedProtocols()
SSLEngine
.public abstract String[] getEnabledProtocols()
SSLEngine
.setEnabledProtocols(String [])
public abstract void setEnabledProtocols(String[] protocols)
The protocols must have been listed by getSupportedProtocols()
as being supported. Following a successful call to this method,
only protocols listed in the protocols
parameter
are enabled for use.
protocols
- Names of all the protocols to enable.IllegalArgumentException
- when one or more of
the protocols named by the parameter is not supported or
when the protocols parameter is null.getEnabledProtocols()
public abstract SSLSession getSession()
SSLSession
in use in this
SSLEngine
.
These can be long lived, and frequently correspond to an entire login session for some user. The session specifies a particular cipher suite which is being actively used by all connections in that session, as well as the identities of the session's client and server.
Unlike SSLSocket.getSession()
this method does not block until handshaking is complete.
Until the initial handshake has completed, this method returns a session object which reports an invalid cipher suite of "SSL_NULL_WITH_NULL_NULL".
SSLSession
for this SSLEngine
SSLSession
public SSLSession getHandshakeSession()
SSLSession
being constructed during a SSL/TLS
handshake.
TLS protocols may negotiate parameters that are needed when using
an instance of this class, but before the SSLSession
has
been completely initialized and made available via getSession
.
For example, the list of valid signature algorithms may restrict
the type of certificates that can used during TrustManager
decisions, or the maximum TLS fragment packet sizes can be
resized to better support the network environment.
This method provides early access to the SSLSession
being
constructed. Depending on how far the handshake has progressed,
some data may not yet be available for use. For example, if a
remote server will be sending a Certificate chain, but that chain
has yet not been processed, the getPeerCertificates
method of SSLSession
will throw a
SSLPeerUnverifiedException. Once that chain has been processed,
getPeerCertificates
will return the proper value.
SSLSession
currently being negotiated.UnsupportedOperationException
- if the underlying provider
does not implement the operation.SSLSocket
,
SSLSession
,
ExtendedSSLSession
,
X509ExtendedKeyManager
,
X509ExtendedTrustManager
public abstract void beginHandshake() throws SSLException
This method is not needed for the initial handshake, as the
wrap()
and unwrap()
methods will
implicitly call this method if handshaking has not already begun.
Note that the peer may also request a session renegotiation with
this SSLEngine
by sending the appropriate
session renegotiate handshake message.
Unlike the SSLSocket#startHandshake()
method, this method does not block
until handshaking is completed.
To force a complete SSL/TLS session renegotiation, the current session should be invalidated prior to calling this method.
Some protocols may not support multiple handshakes on an existing
engine and may throw an SSLException
.
SSLException
- if a problem was encountered while signaling the
SSLEngine
to begin a new handshake.
See the class description for more information on
engine closure.IllegalStateException
- if the client/server mode
has not yet been set.SSLSession.invalidate()
public abstract SSLEngineResult.HandshakeStatus getHandshakeStatus()
SSLEngine
.SSLEngineResult.HandshakeStatus
.public abstract void setUseClientMode(boolean mode)
This method must be called before any handshaking occurs. Once handshaking has begun, the mode can not be reset for the life of this engine.
Servers normally authenticate themselves, and clients are not required to do so.
mode
- true if the engine should start its handshaking
in "client" modeIllegalArgumentException
- if a mode change is attempted
after the initial handshake has begun.getUseClientMode()
public abstract boolean getUseClientMode()
setUseClientMode(boolean)
public abstract void setNeedClientAuth(boolean need)
An engine's client authentication setting is one of the following:
Unlike setWantClientAuth(boolean)
, if this option is set and
the client chooses not to provide authentication information
about itself, the negotiations will stop and the engine will
begin its closure procedure.
Calling this method overrides any previous setting made by
this method or setWantClientAuth(boolean)
.
need
- set to true if client authentication is required,
or false if no client authentication is desired.getNeedClientAuth()
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract boolean getNeedClientAuth()
setNeedClientAuth(boolean)
,
setWantClientAuth(boolean)
,
getWantClientAuth()
,
setUseClientMode(boolean)
public abstract void setWantClientAuth(boolean want)
An engine's client authentication setting is one of the following:
Unlike setNeedClientAuth(boolean)
, if this option is set and
the client chooses not to provide authentication information
about itself, the negotiations will continue.
Calling this method overrides any previous setting made by
this method or setNeedClientAuth(boolean)
.
want
- set to true if client authentication is requested,
or false if no client authentication is desired.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 indicates that sessions may be created; this
is the default. false indicates that an existing session
must be resumedgetEnableSessionCreation()
public abstract boolean getEnableSessionCreation()
setEnableSessionCreation(boolean)
public SSLParameters getSSLParameters()
public void setSSLParameters(SSLParameters params)
This means:
params.getCipherSuites()
is non-null,
setEnabledCipherSuites()
is called with that value
params.getProtocols()
is non-null,
setEnabledProtocols()
is called with that value
params.getNeedClientAuth()
or
params.getWantClientAuth()
return true
,
setNeedClientAuth(true)
and
setWantClientAuth(true)
are called, respectively;
otherwise setWantClientAuth(false)
is called.
params
- the parametersIllegalArgumentException
- if the setEnabledCipherSuites() or
the setEnabledProtocols() call fails
For further API reference and developer documentation, see
Copyright © 1993, 2011, Oracle and/or its affiliates. All rights reserved.