繁体   English   中英

如果我的客户端程序是Java而不是C#,为什么必须添加服务器SSL证书?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM