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。虽然
- 我已经成功获得 SSLSocketFactory
- 我已经成功从 SSLSocketFactory 获得了 SSLSocket
- 我已成功建立安全连接,
但 ClientHello 消息中提供的密码套件均不符合
- CellDefault SSL Settings/NodeDefault SSL Settings/NodeDefault也不
- 也不是我自己的自定义 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正确的那个?
此外,在什么情况下我应该分别使用从这些语句中检索到的工厂?
- SSLSocketFactory.getDefault();
- jsseHelper.getSSLSocketFactory(sslMap, sslProps)
- 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.
另一方面,如果您只想强制执行
- 协议
- 密钥库
- 信任库
此方法:
JSSEHelper.getSSLSocketFactory(sslMap, sslConfig_XYZ)
够了。
我当时使用的是 8.0 版的 Websphere 应用程序服务器。我试图从 JSSEHelper 获取 SSLSocketFactory。虽然
- 我已经成功获得 SSLSocketFactory
- 我已经成功从 SSLSocketFactory 获得了 SSLSocket
- 我已成功建立安全连接,
但 ClientHello 消息中提供的密码套件均不符合
- CellDefault SSL Settings/NodeDefault SSL Settings/NodeDefault也不
- 也不是我自己的自定义 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正确的那个?
此外,在什么情况下我应该分别使用从这些语句中检索到的工厂?
- SSLSocketFactory.getDefault();
- jsseHelper.getSSLSocketFactory(sslMap, sslProps)
- 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.
另一方面,如果您只想强制执行
- 协议
- 密钥库
- 信任库
此方法:
JSSEHelper.getSSLSocketFactory(sslMap, sslConfig_XYZ)
够了。