![](/img/trans.png)
[英]C# network - My form(client program) doesn't show when I start server program
[英]Why do I have to add the server SSL certificate if my client program is in Java and not when it is in C#?
如果我在Java程序中使用HttpsURLConnection
并尝试打开以https://
开头的URL,则会收到错误消息:
无法找到到请求目标的有效认证路径
我发现的解决方案是将服务器证书添加到客户端证书存储中 。 但是,如果我编写一个使用HttpWebRequest
的C#程序,则不必在任何地方添加任何内容。
因此,对我而言,它看起来像C#客户端“正常工作”,而Java客户端仅在用锤子调整后才能工作。
为什么Java客户端需要额外的步骤? 我可以以某种方式跳过将证书保存到JVM的客户端存储吗?
HttpWebRequest将使用Window自己的证书存储来验证证书,即与IE相同。 如果您的IE可以通过将证书或CA路径返回到受信任的根目录来正确验证证书,则HttpWebRequest应该接受证书确定。
在Java情况下,我怀疑添加服务器证书本身是错误的,除非它是自签名的,在这种情况下您别无选择。 您应该改为将CA路径添加回受信任的根目录-您可能可以将这些证书从Windows的CA存储区中拉出,或者如果需要,可以从根CA的网站下载它们。
我相信这是因为C#使用与MSIE相同的HTTP客户端,因此它具有许多预装的SSL证书,其中包括您所使用的SSL证书。 JVM预先安装的证书较少。
默认情况下,Java使用其自己的信任锚集(在默认的信任库中,请参见《 JSSE参考指南》 )。
如果要使用Windows证书存储,可以将Windows-ROOT
密钥存储用作信任存储。
关于此主题的一个很好的信息来源是Oracle网站上的《使用Java SE 6技术在本机平台上利用安全性》和《 Java安全套接字扩展(JSSE)参考指南》 。
如果希望Java使用Windows证书存储来验证证书,则可以在启动时指定以下系统属性:
-Djavax.net.ssl.keyStoreType=Windows-MY -Djavax.net.ssl.trustStoreType=Windows-ROOT
如果只希望一个连接使用Windows证书存储来验证证书,则可以修改以下代码以满足您的需要:
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
KeyStore ts = KeyStore.getInstance("Windows-ROOT");
ts.load(null, null);
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ts);
KeyManagerFactory kmf = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, new char[0]);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
URL url = new URL("https://some.web.site.org");
javax.net.ssl.HttpsURLConnection urlConnection =
(javax.net.ssl.HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(ctx.getSocketFactory());
urlConnection.connect();
try (InputStream in = urlConnection.getInputStream();) {
byte[] chunk = new byte[1024];
for (int len; (len = in.read(chunk)) > -1;) {
System.out.write(chunk, 0, len);
}
} finally {
urlConnection.disconnect();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.