JSSEHelper не предоставляет правильный SSLSocketFactory для развертывания безопасного соединения в Websphere 8.0.

Я работал с версией 8.0 сервера приложений Websphere. Я пытался получить SSLSocketFactory от JSSEHelper. Несмотря на то что

  1. Я успешно получил SSLSocketFactory
  2. Я успешно получил SSLSocket от SSLSocketFactory
  3. Я успешно установил безопасное соединение,

но наборы шифров, предоставленные в сообщении ClientHello, не соответствовали ни

  1. Настройки SSL CellDefault/Настройки SSL NodeDefault/NodeDefaultnor
  2. ни к моей собственной пользовательской конфигурации SSL.


Решение этой проблемы состояло в том, чтобы избежать получения SSLSocketFactory из JSSEHelper. Вместо использования JSSEHelper я должен использовать статический метод getDefault() из класса SSLSocketFactory следующим образом:

public SSLSocket getSslSocket(Properties sslProps) {

SSLSocketFactory factory = SSLSocketFactory.getDefault();

SSLSocket socket = null;
try {
    socket = (SSLSocket) factory.createSocket();
} catch (IOException e) {
    e.printStackTrace();
}
return socket;

}

Более подробную информацию можно найти здесь:
Кто-нибудь может пояснить, почему это утверждение:

slSocketFactory = jsseHelper.getSSLSocketFactory(sslMap, sslProps)

возвращает неверную «фабрику сокетов SSL», в то время как этот оператор

SSLSocketFactory.getDefault()

возвращает правильный?
Кроме того, в каком случае я должен использовать фабрику, полученную из этих операторов соответственно?

  1. SSLSocketFactory.getDefault();
  2. jsseHelper.getSSLSocketFactory(sslMap, sslProps)
  3. getSSLSocketFactory (java.lang.String sslAliasName, java.util.Map connectionInfo, прослушиватель SSLConfigChangeListener)

Спасибо большое


person Michael K    schedule 23.12.2017    source источник
comment
Шифры устанавливаются на сокете SSL. Если вы используете фабрику пользовательских сокетов WAS, шифры будут установлены непосредственно в сокете SSL. В случае, когда вы вызываете SSLSocketFactory.getDefault() в WebSphere, вы получите пользовательскую SSLSocketFactory WebSphere, а WAS обработает установку шифров в возвращаемом сокете SSL. Когда вы получаете SSLSocketFactory от JSSE, вы получаете JSSE SSLSocketFactory, созданную на основе информации о конфигурации SSL, такой как, например, хранилище ключей и хранилище доверенных сертификатов, но мы не можем установить шифры на фабрике сокетов.   -  person Alaine    schedule 29.12.2017
comment
Используйте JSSEHelper.getSSLSocketFactory(connectionInfo, properties), если вы хотите, чтобы SSLSocketFactory создавалась на основе определенных свойств или чтобы динамическое исходящее соединение соответствовало connectionInfo. Используйте JSSEHelper.getSSLSocketFactory(alias, connectionInfo, listener), чтобы получить фабрику сокетов для конкретной конфигурации SSL на основе информации о соединении или информации, связанной с прослушивателем. Я верну фабрику сокетов JSSE, которая не устанавливает шифры на фабрике.   -  person Alaine    schedule 29.12.2017
comment
Спасибо Вам большое. Это было очень полезно!   -  person Michael K    schedule 02.01.2018


Ответы (1)


Хотя это и не интуитивно понятно, утверждение:

SSLSocketFactory factory = SSLSocketFactory.getDefault();

возвращает настраиваемую SSLSocketFactory WebSphere.

Затем вы можете применить SSL-конфигурацию в потоке следующим образом:

    Properties sslProperties = getProperties();
    jsseHelper.setSSLPropertiesOnThread(sslProperties);
    SSLSocket socket = getSslSocket();
    CommonIO.writeToSocket(socket, "127.0.0.1", 1234);
    jsseHelper.setSSLPropertiesOnThread(null);

Хотя JSSEHelper.getSSLSocketFactory(sslMap, sslConfig_XYZ) также возвращает factory, но их сокеты игнорируют наборы шифров, инкапсулированные в SSL-конфигурации sslConfig_XYZ.

С другой стороны, если вы хотите применить только

  1. протокол
  2. хранилище ключей
  3. трастовый магазин

Этот метод:

JSSEHelper.getSSLSocketFactory(sslMap, sslConfig_XYZ)

достаточно.

person Michael K    schedule 06.01.2018