- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用在 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 配置,其中定义了以下密码套件:
不幸的是,ClientHello 请求中提供了不同的密码套件列表:
(此自定义 SSL 配置在其定义中包含 TLSv1.1 协议(protocol)。)
我还尝试了另一种协议(protocol) (TLSv1.2) 和一组较小的密码套件:
ClientHello 请求中再次提供了不同的密码套件列表:
此外,我还检查了 cell-default cipher-suites 和 node-default-cipher-suites 并没有它们与 ClientHello 中提供的匹配:默认节点配置/默认单元配置:
并创建了以下实现。 '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/
我们正在构建一个以 Websphere 7 作为目标环境的 web 应用程序,它使用 CXF 连接到 web 服务。我们已经使用 Jetty 在本地完成了测试,一切顺利。我们现在正在尝试在 Websp
我是一名 Java 程序员,想要开始使用 Websphere 应用程序服务器。有人可以建议一些好的介绍吗?书籍/文章/链接等 最佳答案 IBM 的红皮书是很好的入门资源,还有另一篇关于 IBM 开发人
我试图在 Websphere LP server.xml 文件中映射我的服务器公共(public) IP 地址,但是当我尝试从外部访问它时,出现连接错误。我尝试给 host="localhost"并尝
我试图在 Websphere LP server.xml 文件中映射我的服务器公共(public) IP 地址,但是当我尝试从外部访问它时,出现连接错误。我尝试给 host="localhost"并尝
在将应用程序从单个 Websphere Application Server 迁移到 Websphere 集群之前,我们应该注意什么 最佳答案 这是我根据经验列出的 list 。它并不完整,但应涵盖最
我已经为 WebSphere 中的容器设置了一些自定义属性,但我不知道如何读取这些属性。我试过 System.getProperty(...),但它是空的。 我看过对 JMX 的引用,但想知道是否有明
我目前正在研究 IBM Websphere Application Server 和 IBM Websphere Process Server 之间的区别? 我知道 Process Server 就像
我正在处理一个应用程序,它需要知道它是在 WAS 上运行还是在 Liberty Profile 上运行。 在 WAS 上,它必须调用 Admin API,但在 Liberty Profile 上,它必
我很难解决“找不到委托(delegate)人...”的问题。我阅读了所有文章,但我已成功将 ear 文件安装到 WAS 8.5 中。 此应用程序要求最终用户进行 LDAP 身份验证才能登录。我的 LD
我正在开发许多用于管理 WAS 基础设施的脚本,我觉得 IBM 的某个人搞砸了 wsadmin故意。这不可能是意外。 这是一个“简单”的例子: for node in AdminConfig.list
我删除了 C:\Program Files (x86)\IBM\WebSphere\AppServer\profiles 中的配置文件,它仍然显示在配置文件管理工具中,如何删除配置文件管理工具中的配置
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我有一个 WebSphere 应用程序服务器 8,我在其中部署了一个企业应用程序。现在我想让该应用程序的 Web GUI 可以访问。因此,我设置了一个端口 (9080),添加了一个 Web 容器传输链
是否可以用 Weld 替换 WebSphere 8 的 CDI 提供程序 (OpenWebBeans)?如果做不到这一点,是否有任何方法可以在 WebSphere 中完全禁用 CDI? 我为什么需要这
我有一个带有@local 和@remote 注释的无状态EJB SessionBean。该代码在 weblogic 服务器中运行良好。但是,将其部署到 Websphere 时会出现以下异常。 bm.e
我们正在尝试安装 Websphere 应用程序服务器的补丁。但已经获得了 Websphere 商务服务器的说明。所以只是想知道两者是否相同并且可以应用相同的指令。 我们是否需要 root 访问权限来执
我已经安装了 WebSphere Liberty 配置文件 8.5 。我可以使用 http://localhost:9080 访问 WebSphere 服务器 但不确定如何启动 Admin Conso
我在 WebSphere 应用程序服务器上将一个依赖 jar 扔到我爆炸的 EAR 中。我需要停止/启动 EAR 才能让 WS 执行新代码。有没有办法从命令行执行此操作? 最佳答案 尝试运行这样的东西
我全新安装了 Wesphere 6.1 Fixpack 23。我部署了一个需要 MQSeries JMS 队列的应用程序。我设置了一个基于 MQSeries 提供者的请求和回复队列以及一个基于 MQS
session 超时后是否可以将用户带到自定义网页?在 websphere 中要设置的参数是什么? 最佳答案 我不知道 WAS 中有这样的设置。 我认为您最好的机会是实现 Filter这将检查 ses
我是一名优秀的程序员,十分优秀!