当前位置: 首页 > 知识库问答 >
问题:

Ssl握手失败,找不到请求目标的有效证书路径

滑畅
2023-03-14

首先,我知道以前有人问过这个问题,但我尝试了提出的解决方案,但没有结果。

我正在尝试用java开发一个简单的程序,它连接到一个网站,并从那里托管的文本文件中读取。一开始我以为证书会造成问题,因为在没有收到警告的情况下,我无法在firefox上打开网站。Internet explorer不会产生任何问题。代码如下:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.*;

public class insig
{
    public static void main(String[] args) throws IOException
    {
        URL fpath           = new URL("website/test.txt");
        BufferedReader br   = new BufferedReader(new InputStreamReader(fpath.openStream()));

        String Reader = null;

        while((Reader = br.readLine()) != null)
        {
            System.out.println(Reader);
        }
    }
}

我尝试的第一件事是Java提供的解决方案:sun.security.provider.CertPath.SunCertPathBuilderException:无法找到请求目标的有效认证路径,但没有成功。试着调试,虽然我对此并不是很了解,但在http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/readdebug.html的帮助下,我能够理解,在找到可信证书部分之前,所有的事情都是相应的。已经检查了是否将证书添加到正确版本的jre中,但仍然存在同样的问题。

这个问题可以和网站所有者一起解决吗?它只是因为这不会只在我的PC上运行,所以它不方便配置每一个运行的PC上的一切。

共有1个答案

章茂
2023-03-14

再说一遍,有三种方式:

>

  • 在JRE存储中添加证书链(使用keytool命令为yes)。

    创建您自己的存储(再次使用keytool)并随程序提供它,并将其设置为-d属性。

    正如我给你的链接中所说的,请看我的评论:

    // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
             //Vadim: here is the place to check client certs and throw an exception if certs are wrong. When there is nothing all certs accepted. 
            }
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
             //Vadim: here is the place to check server certs and throw an exception if certs are wrong. When there is nothing all certs accepted. 
            }
        } };
        // Install the all-trusting trust manager
        final SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                // Here is the palce to check host name against to certificate owner
                return true;
            }
        };
    
        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
    
        URL url = new URL("https://www.google.com");
    

    如果您将按原样使用它,那么将不会有任何证书验证--所有证书和所有主机都被接受。

  •  类似资料:
    • 我试图访问我的应用程序中的网址,但我得到了这个错误。 我尝试应用所有这些修复,但没有成功:http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/ 很快,它需要运行InstallCert应用程序(j

    • 我最近为我的maven repo(Apache代理背后的人工制品)切换到了letsencrypt证书。通过浏览器访问回购协议工作正常,证书没有问题(下面的屏幕截图)。 如果我手动将证书导入到java密钥库中,它也可以工作。 但是根据这个SO问题,Java应该接受以8u101开头的lets加密证书。 我总是遇到这样的例外:

    • 我正在使用WSO2 API管理器和Keyclope服务器进行API网关和用户身份验证。两者都在Openshift 3.11上运行。在浏览器上,尝试重定向到wso2 apim上的存储页面时出现以下错误。此外,我正在为这两个服务器使用一个使用keytool生成的自签名证书,它还分别导入到JVM cacerts中。Open JDK版本为1.8。 我在使用javax时遇到了致命的问题。网ssl。SSLEx

    • 我在Glassfish上有一个使用GoDaddy SSL证书的JAVA EE webapp。HTTP侦听器重定向到HTTPS侦听器。 我正在尝试让从Googlebot爬虫的网络应用程序中获取页面。该代码在未启用SSL的暂存服务器上按预期工作。但是,在具有GoDaddy SSL证书的实时服务器上,当尝试获取网页时,我会收到以下错误。 我已经尝试了这里指定的解决方法(http://www.mkyong

    • 连接Ex:javax.net.ssl.sslHandShakeException:Sun.Security.Validator.ValidatoreXception:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径 代码:

    • 我正在尝试使用twitter4j库为我的Java项目获取tweets,该项目使用(可以在stack trace中看到)。在第一次运行时,我收到一个关于证书和的错误。然后我通过以下方式添加了twitter证书: 但没有成功。下面是获取Tweets的程序: 这里有一个错误: