有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

http HttpURLConnection在Java中总是抛出IOException

我尝试捕获url为http或https的两种情况,并分别进行url连接。然而,当我使用下面的代码时,https连接总是抛出一个IOException,而http连接工作

//proxy, url, are given variables
URL checkUrl = new URL(url);
            HttpURLConnection connect = null;
            if(checkUrl.getProtocol().toLowerCase().equals("https")) {
                connect = (HttpsURLConnection) new  URL(url).openConnection(proxy);
                
            }else {
                connect = (HttpURLConnection) new  URL(url).openConnection(proxy);
            }

....
connect.connect();

执行connect()命令后,我的程序跳转到catch IOException分支。我得到了javax。网ssl。SSLHandshakeException:太阳。安全验证器。ValidatorException:PKIX路径生成失败:sun。安全供应商。certpath。SunCertPathBuilderException:找不到请求目标的有效证书路径

当我调试它时,我的connect变量在执行httpsurlconnection openConnection()命令之后会得到一个值“HttpsURLConnectionImpl(id=48)”


共 (2) 个答案

  1. # 1 楼答案

    错误PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target总是意味着一件事:JVM不信任您尝试连接到的https端点。JVM的信任存储中有大约90个证书。如果您连接到的服务器提供其证书和由其中一个证书和CA链锚定的CA链,您将不会看到该问题。通过使用openssl(例如openssl.exe s_client -connect www.google.com:443)、portecle或certcheckerapp之类的工具,您可以准确地看到服务器呈现的证书链。com(可以作为Docker映像在本地运行)

    一种解决方法是将服务器的证书添加到您的信任库中(使用keytool -import -file <thecertificate.cer> -keystore <location-of-cacerts-file>。理想的解决方案是确保您连接的服务器呈现一个链,并将信任锚点(链中最顶端的证书)添加到您的信任库中

  2. # 2 楼答案

    这意味着您的信任存储中没有正确的证书。Java程序使用此存储来验证服务器证书

    通常,如果java安装正确,默认存储区将包含大多数CAs证书,因此在维护与大多数https资源的连接时不会出现问题。但是,如果您没有正确安装,或者您正试图访问某些使用公司CA密钥签名证书的公司资源,则您的存储中可能没有所需的证书

    解决方法是将服务器返回的证书直接导入信任存储。这里是the detailed guide on how to do that