在我工作的公司,我正在 WebSphere 6.1 服务器上开发一个 Web 应用程序。我正在编写的 Web 应用程序必须使用带有相互身份验证的 SSL 连接来连接到外部公司。
首先要说的是:我有点像菜鸟,如果我会说一些愚蠢的话,很抱歉:)
我有公共和私人证书。我已将私有证书添加到 NodeDefaultKeyStore 并将公共证书链添加到 NodeDefaultTrustStore。然后我看到服务器有一个封装了 KS 和 TS 的 SSL 配置,并且这个配置链接到我正在运行我的应用程序的节点。
作为客户端库,我使用的是 HttpClient 4.2.3。我像这样创建了 HttpClient
Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
// e) SETUP SSL
SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSystemSocketFactory();
Scheme httpsScheme = new Scheme("https", HTTPS_PORT, sslSocketFactory);
Scheme httpScheme = new Scheme("http", HTTP_PORT, PlainSocketFactory.getSocketFactory());
final SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(httpScheme);
schemeRegistry.register(httpsScheme);
PoolingClientConnectionManager connManager = new PoolingClientConnectionManager(schemeRegistry);
// f) CREAZIONE CLIENT HTTP
HttpClient httpClient = new DefaultHttpClient(sslSocketFactory);
// g) CREAZIONE DEL PROXY (possibile che venga disattivato)
Resources res = new Resources();
String proxyHost = res.get(PROXY_HOST);
int proxyPort = Integer.parseInt(res.get(PROXY_PORT));
HttpHost proxy = new HttpHost(proxyHost, proxyPort);
httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
System.setProperty("java.net.useSystemProxies", "false");
// ######################## ==> CHIAMATA AD INPS
HttpResponse resp = httpClient.execute(httpPost);
我看过 SSLSocketFactory 并且不包含我指定的证书。我已经看到 SSLSOcketFactory.getSystemSocketFactory() 只是读取 javax.ssl.xxxxx 属性来初始化用于 SSL 连接的 KS 和 TS。
所以......我必须将服务器配置链接到我的应用程序,但我不确定如何以“正确”的方式进行操作:我可以在运行时使用 System.setProperty 设置此类属性,但我认为它是这不是做这种工作的好方法。有没有办法从应用程序中引用 SSL 配置(可能通过 JNDI)?或者最好的方法是配置两个链接到 KS 和 TS 文件的 URL 并手动配置 SSLSocketFactory?
提前感谢您的回复!洛伦佐