gpt4 book ai didi

java - 如何从 JavaFX 应用程序连接到 HTTPS URL

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:37 26 4
gpt4 key购买 nike

我有一个 Javafx 应用程序,它通过 HTTPS 将 GET 和 POST 请求发送到安全的 Web 服务。托管 web 服务的服务器上的 SSL 设置是单向 ssl,即 Javafx 应用程序验证服务器的身份,但服务器不验证胖客户端的身份。

应用服务器位于具有证书(由外部机构签名)的 F5 之后。

对于浏览器来说,这不会是一个问题,因为浏览器本身会处理验证服务器的身份并向用户显示相关警告。但是对于胖客户端,我不确定在发送请求之前如何验证服务器的身份。请让我知道如何在 Javafx 应用程序中处理此问题。

我之前确实问过一个与此相关的问题 herehere ,但那些没有帮助。因此,请原谅我对这个主题的了解有限。

如有任何帮助,我们将不胜感激。

最佳答案

如果您的证书在 Firefox/java 中不起作用,很可能是 Firefox/java 不知道它的颁发者。

如何让它工作:

  1. 获取服务器的完整证书链。你可以用 Firefox 做到这一点。查看证书 -> 详细信息 -> 导出到 .pem 文件。在您的情况下,链将包含至少 2 个证书(服务器证书和 CA 证书,CA 可能是自签名的,也可能不是)在 .pem 文件中导出 CA 证书。

  2. 现在您可以强制 java 信任该 CA,这可以通过多种方式完成,例如,您可以在 jre cacerts 中添加 CA 证书或为 HttpsURLConnection 创建自定义 SSLContext。

  3. 如果您对 DNS 或 etc.hosts 进行了修改,请将其回滚。连接地址需与证书CN匹配,包含通配符。

  4. 使用该代码连接到您的服务器:

    public void test() throws Exception {
    URL u = new URL(
    "https://my-server.com/my-webservices/data");
    HttpsURLConnection http = (HttpsURLConnection) u.openConnection();
    http.setSSLSocketFactory(createSSLContext().getSocketFactory());
    http.setAllowUserInteraction(true);
    http.setRequestMethod("GET");
    http.connect();

    InputStream is = http.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder stringBuilder = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null)
    {
    stringBuilder.append(line
    + "\n");
    }
    System.out.println(stringBuilder.toString());

    }

    private SSLContext createSSLContext() throws Exception {
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    FileInputStream in = new FileInputStream("path_to_ca_file.pem");
    KeyStore trustStore = KeyStore.getInstance("JKS");
    trustStore.load(null);
    try {
    X509Certificate cacert = (X509Certificate) cf.generateCertificate(in);
    trustStore.setCertificateEntry("ca", cacert);
    } finally {
    IOUtils.closeQuietly(in);
    }

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(trustStore);

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
    return sslContext;
    }

关于java - 如何从 JavaFX 应用程序连接到 HTTPS URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com