2

我正在使用 8.0 版本的 Websphere 应用程序服务器。我试图从 JSSEHelper 获取 SSLSocketFactory。虽然

  1. 我已经成功获得 SSLSocketFactory
  2. 我已经成功地从 SSLSocketFactory 获得了 SSLSocket
  3. 我已成功建立安全连接,

但是 ClientHello 消息中提供的密码套件既不对应

  1. CellDefault SSL 设置/NodeDefault SSL 设置/NodeDefaultnor
  2. 也不是我自己的自定义 SSL 配置。


此问题的解决方案是避免从 JSSEHelper 检索 SSLSocketFactory。我应该使用 SSLSocketFactory 类中的静态方法 getDefault() 而不是使用 JSSEHelper:

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 listener)

非常感谢你

4

1 回答 1

0

虽然不直观,但声明:

SSLSocketFactory factory = SSLSocketFactory.getDefault();

返回WebSphere 自定义 SSLSocketFactory

然后您可以通过这种方式在线程上强制执行 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) 也返回工厂,但它们的套接字忽略封装在 SSL 配置sslConfig_XYZ中的密码套件。

另一方面,如果您只想强制执行

  1. 协议
  2. 密钥库
  3. 信任库

这种方法:

JSSEHelper.getSSLSocketFactory(sslMap, sslConfig_XYZ)

足够了。

于 2018-01-06T08:27:26.317 回答