我正在编写一个Java应用程序,通过HTTPS连接到两个Web服务器。 一个通过默认信任链得到一个可信的证书,另一个使用自签名证书。 当然,连接到第一台服务器的工作,而使用自签名证书连接到服务器不工作,直到我用该服务器的证书创build一个信任存储。 但是,默认情况下,受信任服务器的连接不再起作用,因为显然默认的trustStore在创build自己的服务器时会被忽略。 我find的一个解决scheme是从默认的trustStore添加证书到我自己的。 但是,我不喜欢这个解决scheme,因为它需要我继续pipe理那个trustStore。 (我不能认为这些证书在可预见的将来会保持不变,对吗?) 除此之外,我发现两个5岁的线程有类似的问题: 在JVM中注册多个密钥库 我怎样才能有一个Java服务器的多个SSL证书 他们都深入到Java的SSL基础设施。 我希望现在有一个更方便的解决scheme,我可以很容易地解释我的代码的安全审查。
密钥库和信任库之间有什么区别?
我有一个简单的Web服务调用,由.NET(C#)2.0 Windows应用程序生成,通过由Visual Studio生成的Web服务代理,也用C#(2.0)编写的Web服务。 这已经工作了好几年了,而且还在十几个地方继续这样做。 新网站的新安装会遇到问题。 尝试调用Web服务时,失败并显示消息: 无法build立SSL / TLS安全通道的信任关系 Web服务的URL使用SSL(https://) – 但是这已经在许多其他位置上工作了很长时间(并继续这样做)。 我在哪里看? 这可能是Windows和.NET之间的安全问题吗? 如果是这样,我在哪里build立信任关系? 我迷路了!
我添加到我们的大型Java应用程序的模块必须与另一家公司的SSL安全网站进行交stream。 问题是该网站使用自签名证书。 我有一份证书副本,用于确认我没有遇到中间人攻击,并且需要将此证书合并到我们的代码中,以便与服务器的连接成功。 这是基本的代码: 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 …. […]