gpt4 book ai didi

ssl - 在 Websphere 8.0 上使用 JSSEHelper 以编程方式指定出站 SSL 配置。不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:28 24 4
gpt4 key购买 nike

我正在尝试使用在 WAS 8.0.0.13(使用 java 1.6.0 的 IBM Websphere 应用程序服务器)中配置的自定义出站 ssl 配置以编程方式创建 SSL 连接:(安全->SSL证书和 key 管理->相关项目:SSL配置)。安全连接已成功创建:驻留在 WAS 服务器上的 servlet 已连接到监听 127.0.0.1:1234 的服务器端套接字。问题是我在 SSL 配置中的“保护质量 (QoP) 设置”中定义的首选密码套件被忽略了。所有其他属性(例如协议(protocol)或 JSSE 提供程序)都被很好地考虑。

我已经实现了一个充当 SSL 客户端角色的 Servlet。此 Servlet 使用此自定义 SSL 配置,其中定义了以下密码套件:

  1. SSL_RSA_WITH_AES_128_CBC_SHA
  2. SSL_DHE_RSA_WITH_AES_128_CBC_SHA
  3. SSL_DHE_DSS_WITH_AES_128_CBC_
  4. SHA SSL_RSA_WITH_AES_128_GCM_SHA256
  5. SSL_RSA_WITH_AES_128_CBC_SHA256
  6. SSL_DHE_RSA_WITH_AES_128_GCM_SHA256
  7. SSL_DHE_RSA_WITH_AES_128_CBC_SHA256
  8. SSL_DHE_DSS_WITH_AES_128_GCM_SHA256
  9. SSL_DHE_DSS_WITH_AES_128_CBC_SHA256

不幸的是,ClientHello 请求中提供了不同的密码套件列表:

  1. SSL_RSA_WITH_AES_128_CBC_SHA
  2. SSL_DHE_RSA_WITH_AES_128_CBC_SHA
  3. SSL_DHE_DSS_WITH_AES_128_CBC_SHA
  4. SSL_RSA_WITH_3DES_EDE_CBC_SHA
  5. SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
  6. SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  7. SSL_RSA_WITH_DES_CBC_SHA
  8. SSL_DHE_RSA_WITH_DES_CBC_SHA
  9. SSL_DHE_DSS_WITH_DES_CBC_SHA
  10. SSL_RENEGO_PROTECTION_REQUEST

(此自定义 SSL 配置在其定义中包含 TLSv1.1 协议(protocol)。)

我还尝试了另一种协议(protocol) (TLSv1.2) 和一组较小的密码套件:

  1. SSL_RSA_WITH_AES_128_CBC_SHA
  2. SSL_DHE_RSA_WITH_AES_128_CBC_SHA
  3. SSL_DHE_DSS_WITH_AES_128_CBC_SHA
  4. SSL_DHE_DSS_WITH_AES_128_CBC_SHA256

ClientHello 请求中再次提供了不同的密码套件列表:

  1. SSL_RSA_WITH_AES_128_CBC_SHA
  2. SSL_DHE_RSA_WITH_AES_128_CBC_SHA
  3. SSL_DHE_DSS_WITH_AES_128_CBC_SHA
  4. SSL_RSA_WITH_3DES_EDE_CBC_SHA
  5. SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA

此外,我还检查了 cell-default cipher-suites 和 node-default-cipher-suites 并没有它们与 ClientHello 中提供的匹配:默认节点配置/默认单元配置:

  1. SSL_RSA_WITH_AES_128_CBC_SHA
  2. SSL_DHE_RSA_WITH_AES_128_CBC_SHA
  3. SSL_DHE_DSS_WITH_AES_128_CBC_SHA
  4. SSL_RSA_WITH_AES_128_GCM_SHA256
  5. SSL_RSA_WITH_AES_128_CBC_SHA256
  6. SSL_DHE_RSA_WITH_AES_128_GCM_SHA256
  7. SSL_DHE_RSA_WITH_AES_128_CBC_SHA256
  8. SSL_DHE_DSS_WITH_AES_128_GCM_SHA256
  9. SSL_DHE_DSS_WITH_AES_128_CBC_SHA256

我已遵循以下说明: https://www.ibm.com/support/knowledgecenter/en/SSAW57_8.0.0/com.ibm.websphere.nd.doc/info/ae/ae/tsec_ssloutconfiguseJSSE.html

并创建了以下实现。 'doGet' 方法是一个入口点:

public class TLSv1_1 extends HttpServlet {
private static final long serialVersionUID = 1L;
com.ibm.websphere.ssl.JSSEHelper jsseHelper;

public TLSv1_1() {
super();
jsseHelper = com.ibm.websphere.ssl.JSSEHelper.getInstance();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

Properties existing_sslProps = null;
try {
String existingAlias = "TLSv1.1";
existing_sslProps = jsseHelper.getProperties(existingAlias);

} catch (com.ibm.websphere.ssl.SSLException e) {
e.printStackTrace();
}
printSSLproperties(response, existing_sslProps);
SSLSocket socket = getSslSocket(existing_sslProps);
writeToSocket(socket, 1234);
}

public static void printSSLproperties(HttpServletResponse response, Properties sslProps) throws IOException {
if (sslProps != null) {
StringBuilder sb = new StringBuilder();
Set set = sslProps.entrySet();
Iterator it = set.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Object value = entry.getValue();
sb.append("key: " + entry.getKey() + ", value: " + value + "\n");
}
System.out.println("sslProps: -----------\n" + sb.toString());
} else {
System.out.println("sslProps == null");
response.getWriter().append("sslProps == null");
}
}

public SSLSocket getSslSocket(Properties sslProps) {
Map<String, Object> sslMap = new HashMap<String, Object>();

sslMap.put("com.ibm.ssl.direction", "outbound");
sslMap.put("com.ibm.ssl.remoteHost", "127.0.0.1");
sslMap.put("com.ibm.ssl.remotePort", "1234");
sslMap.put("com.ibm.ssl.endPointName", "HTTP");
SSLSocketFactory sslSocketFactory = null;
try {
sslSocketFactory = jsseHelper.getSSLSocketFactory(sslMap, sslProps);
} catch (SSLException e) {
e.printStackTrace();
}

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

public static void writeToSocket(Socket socket, int port) throws IOException, UnknownHostException {

InetAddress address = InetAddress.getByName("127.0.0.1");
socket.connect(new InetSocketAddress(address, port));
BufferedWriter stream = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

for (int i = 0; i < 3; i++) {
String lineX = UUID.randomUUID().toString();
stream.write(lineX);
stream.newLine();
stream.flush();
System.out.println("NEW LINE SUCCESSFULLY WRITTEN INTO SOCKET:" + lineX);
sleep();
}
}

private static void sleep() {

try {
Thread.sleep(1000 * 30);
} catch (InterruptedException e) {

}
}

HashMap sslMap 的存在似乎并不重要。设置为 null 还是不包含任何值都没有关系。

我还尝试在线程上强制执行 ssl 属性(这个在所有其他线程中具有最高的偏好):这种方法也行不通:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String existingAlias = "TLSv1.1";
existing_sslProps = jsseHelper.getProperties(existingAlias);

jsseHelper.setSSLPropertiesOnThread(existing_sslProps);

CommonIO.printSSLproperties(response, existing_sslProps);
SSLSocket socket = getSslSocket(existing_sslProps);
CommonIO.writeToSocket(socket, 1234);

jsseHelper.setSSLPropertiesOnThread(null);
}

最后,我尝试不绑定(bind)到 WAS 服务器 SSL 配置中存在的任何 SSL 配置,而只使用我的 java 代码连接自定义配置:

sslProps.setProperty("com.ibm.ssl.protocol", "TLSv1.1");
sslProps.setProperty("com.ibm.ssl.enabledCipherSuites",
"SSL_DHE_DSS_WITH_AES_128_CBC_SHA SSL_DHE_DSS_WITH_AES_128_GCM_SHA256 SSL_DHE_DSS_WITH_AES_128_CBC_SHA256");
sslProps.setProperty("com.ibm.ssl.trustStore",
"/opt/IBM/Websphere/profiles/AppSrv01/config/cells/localhostCell01/nodes/localhostNode01/trust.p12");
sslProps.setProperty("com.ibm.ssl.trustStorePassword", "***");
sslProps.setProperty("com.ibm.ssl.trustStoreType", "PKCS12");
sslProps.setProperty("com.ibm.ssl.keyStore",
"/opt/IBM/Websphere/profiles/AppSrv01/config/cells/localhostCell01/key.p12");
sslProps.setProperty("com.ibm.ssl.keyStorePassword", "***");
sslProps.setProperty("com.ibm.ssl.keyStoreType", "PKCS12");

sslProps.setProperty("security.provider.1", "com.ibm.jsse2.IBMJSSEProvider2");
sslProps.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");

但是这种方法也行不通。请你帮助我好吗?我想我错过了一些主要的东西,或者这个产品中不存在自定义 SSL 配置。

最佳答案

所以由于我最初没有仔细查看您的代码。我看到了问题。因为您直接从 JSSEHelper 获取套接字工厂,所以我们没有机会将密码放在套接字上。

在您的情况下,您应该遵循 WAS 的编程 SSL 方法。获取属性并将它们放在线程上。例如

 try {
String existingAlias = "TLSv1.1";
existing_sslProps = jsseHelper.getProperties(existingAlias);
jsseHelper.setSSLPropertiesOnThread(existing_sslProps);

} catch (com.ibm.websphere.ssl.SSLException e) {
e.printStackTrace();
}

后面不要从 JSSE 获取 Socket 工厂,获取默认值。所以在 getSslSocket() 中做类似的事情:

public SSLSocket getSslSocket(Properties sslProps) {

SSLSocketFactory factory = SSLSocketFactory.getDefault();

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

这将为您提供一个 WAS 套接字工厂。创建套接字调用应该返回一个套接字,其中包含在 SSLSocket 上设置的密码。完成后,您应该清除线程​​中的属性。

jsseHelper.setSSLPropertiesOnThread(null);

关于ssl - 在 Websphere 8.0 上使用 JSSEHelper 以编程方式指定出站 SSL 配置。不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47827493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com