在Java中的Https连接


0

我已成功使用生成密钥库

keytool -genkeypair -alias SomeAlias -keyalg RSA -validity 365 -keystore NAME.keystore -storetype JKS

将它放在tomcat配置目录和更新的server.xml文件中,启用8443端口监听。

所以我可以访问 https://开头本地主机:8443 / MyApp的

但是当我试图发布一些数据时 https://开头本地主机:8443 / MyApp的 https://开头本地主机:8443 / MyApp的

sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

我的POST功能:

    public void HttpsPostData(String data, URL url){
    try {
        String encodedData = URLEncoder.encode("data", "UTF-8") + "=" + URLEncoder.encode(data, "UTF-8");
        HttpsURLConnection con = (HttpsURLConnection)url.openConnection();

        con.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
        wr.write(encodedData);
        wr.flush();

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

        String inputLine;

        while ((inputLine = in.readLine()) != null)
        {
            System.out.println(inputLine); 
        }

        in.close();
    } catch (IOException ex) {
        Logger.getLogger(Sender.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我错过了什么?

Answers:


1

即使它是localhost,您也必须信任服务器证书。可能最简单的方法是使用一个名为的Java应用程序 InstallCert 。查看博客文章 这里

快速步骤:

  1. 用Install编译InstallCert.java javac InstallCert.java
  2. 呼叫 java InstallCert localhost:8443,信任证书和InstallCert将生成一个名为的文件 jssecacerts
  3. 复制 jssecacerts 到你的JDK目录下 jre/lib/security 目录。

并且程序应该能够信任证书。


是否有可能在运行时不触及java.home?
Eir Nym

@EirNym显然是的(见: exampledepot.com/egs/javax.net.ssl/TrustAll.html )。我只推荐这个用于测试目的,因为这基本上使SSL无用。
miq

因此,我可以轻松地使X509TrustManager具有部分信任!
Eir Nym

1
@EirNym如果你想使用不同的信任库(除了 cacerts 在JRE主目录中),你可以使用 javax.net.ssl.trustStore (和相关的)系统属性。
Bruno

布鲁诺,谢谢!它非常实用!
Eir Nym
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.