JSSEHelper 不提供正确的 SSLSocketFactory 用于在 Websphere 8.0 中建立安全连接

JSSEHelper does not provide the correct SSLSocketFactory for extablishing secure connection in Websphere 8.0

我当时使用的是 8.0 版的 Websphere 应用程序服务器。我试图从 JSSEHelper 获取 SSLSocketFactory。虽然

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

但 ClientHello 消息中提供的密码套件均不符合

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


此问题的解决方案是避免从 JSSEHelper 检索 SSLSocketFactory。我应该使用 SSLSocketFactory class 中的静态方法 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)

returns 不正确 'SSL socket factory' 而此语句

SSLSocketFactory.getDefault()

returns正确的那个?
此外,在什么情况下我应该分别使用从这些语句中检索到的工厂?

  1. SSLSocketFactory.getDefault();
  2. jsseHelper.getSSLSocketFactory(sslMap, sslProps)
  3. getSSLSocketFactory(java.lang.String sslAliasName, java.util.Map connectionInfo, SSLConfigChangeListener 侦听器)

非常感谢

虽然不直观,声明:

SSLSocketFactory factory = SSLSocketFactory.getDefault();

returns 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) returns 也是工厂,但它们的套接字忽略封装在 SSL 配置中的密码套件 sslConfig_XYZ.

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

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

此方法:

JSSEHelper.getSSLSocketFactory(sslMap, sslConfig_XYZ)

够了。