我添加到我们的大型Java应用程序中的一个模块必须与另一家公司的SSL安全网站进行交互。问题是站点使用的是自签名证书。我有一个证书的副本来验证我没有遇到中间人攻击,我需要将这个证书合并到我们的代码中,这样才能成功连接到服务器。
下面是基本代码:
void sendRequest(String dataPacket) {
String urlStr = "https://host.example.com/";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setMethod("POST");
conn.setRequestProperty("Content-Length", data.length());
conn.setDoOutput(true);
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());
o.write(data);
o.flush();
}
如果不对自签名证书进行任何额外的处理,这将在conn.getOutputStream()中终止,但以下情况除外:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我还看到我可以创建一个TrustManager实例来执行一些自定义检查。看起来我甚至可以创建一个TrustManager,该TrustManager在除这一个证书之外的所有实例中都委托给真正的TrustManager。但看起来TrustManager是全局安装的,我想这会影响我们应用程序的所有其他连接,我也觉得不太对劲。
设置Java应用程序以接受自签名证书的首选、标准或最佳方法是什么?我能完成以上所有的目标吗?还是我不得不妥协?是否有一个涉及文件、目录和配置设置的选项,以及从少到无的代码?
自己创建一个SSLSocket
工厂,并在连接之前将其设置在HttpSurlConnection
上。
...
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslFactory);
conn.setMethod("POST");
...
您需要创建一个SSLSocketFactory
并保留它。下面是如何初始化它的草图:
/* Load the keyStore that includes self-signed cert as a "trusted" entry. */
KeyStore keyStore = ...
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
sslFactory = ctx.getSocketFactory();
如果您需要创建密钥存储的帮助,请发表评论。
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(trustStore, trustStorePassword);
trustStore.close();
keytool -import -file selfsigned.pem -alias server -keystore server.jks
问题内容: 我要添加到大型Java应用程序中的模块必须与另一家公司的SSL安全网站进行对话。问题是该站点使用自签名证书。我有证书的副本以验证我没有遇到中间人攻击,并且我需要将此证书合并到我们的代码中,以确保成功连接到服务器。 这是基本代码: 如果没有对自签名证书进行任何其他处理,它将死于conn.getOutputStream(),但以下情况除外: 理想情况下,我的代码需要教会Java在应用程序中
问题内容: 我正在创建一个laravel程序包,在这个页面中我需要在Redis中保存一些数据,但是我希望该程序包使用不同的Redis连接,以便他们可以在程序包的配置文件中设置Redis详细信息凭据并将其用于这个包。我想给包用户使用不同的Redis连接的自由。 如果您有任何想法,我怎么能做到这一点。任何帮助,将不胜感激。 问题答案: 文档中有一节称为 使用多个Redis连接 更改连接呼叫 您可以在运
我有一些依赖于项目,我有一些依赖于
我创建了一个Spring Boot应用程序,它实例化了ActiveMQSSLBroker的一个实例。我试图使用HermesJMS作为客户端连接到此代理。 我在Hermes中配置了连接工厂,如下所示: null 代理在spring-boot应用程序中的配置如下: SSL连接器: brokerurl:ssl://localhost:61616 键管理器: 从keymanagerfactory.getk
问题内容: 我是否需要创建一个将接口绑定到其他实现的新模块? 我无法触摸厨师课堂或界面。我只是在运行时将Chef的FortuneService绑定到不同接口的客户端。 问题答案: 外观类似于Guice常见问题解答中的“ 机器人腿”部分。“如何创建一个带有两个Leg对象的机器人,左边的一个对象注入一个LeftFoot,右边的一个注入RightFoot。” 但是只有一个在两个上下文中都可以重用的Leg
我的连接代码如下所示: 干杯,马尔辛