2018-02-08 HTTPS证书问题、PKIX或者证书过期问题解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-02-08 HTTPS证书问题、PKIX或者证书过期问题解决方案相关的知识,希望对你有一定的参考价值。

参考技术A private static class TrustAnyTrustManager implements X509TrustManager

   

        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException

       

       

        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException

       

       

        public X509Certificate[] getAcceptedIssuers()

       

            return new X509Certificate[];

       

   

    private static class TrustAnyHostnameVerifier implements HostnameVerifier

   

        public boolean verify(String hostname, SSLSession session)

       

            return true;

       

   

    public static String connect(String url) throws Exception

   

        InputStream in = null;

        OutputStream out = null;

        byte[] buffer = new byte[4096];

        String str_return = "";

        try

       

//            URL console = new URL(url);

            URL console = new URL(new String(url.getBytes("utf-8")));

            HttpURLConnection conn = (HttpURLConnection) console.openConnection();

            //如果是https

            if (conn instanceof HttpsURLConnection)

           

                SSLContext sc = SSLContext.getInstance("SSL");

                sc.init(null, new TrustManager[]new TrustAnyTrustManager(), new java.security.SecureRandom());

                ((HttpsURLConnection) conn).setSSLSocketFactory(sc.getSocketFactory());

                ((HttpsURLConnection) conn).setHostnameVerifier(new TrustAnyHostnameVerifier());

           

//            conn.setRequestProperty("Content-type", "text/html");

//            conn.setRequestProperty("Accept-Charset", "GBK");

//            conn.setRequestProperty("contentType", "GBK");

//            conn.setRequestMethod("POST");

//            conn.setDoOutput(true);

//            conn.setRequestProperty("User-Agent", "directclient");

//            PrintWriter outdate = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));

//            outdate.println(url);

//            outdate.close();

            conn.connect();

            InputStream is = conn.getInputStream();

            DataInputStream indata = new DataInputStream(is);

            String ret = "";

            while (ret != null)

           

                ret = indata.readLine();

                if (ret != null && !ret.trim().equals(""))

               

                    str_return = str_return + new String(ret.getBytes("ISO-8859-1"), "utf-8");

               

           

            conn.disconnect();

        catch (Exception e)

       

            throw e;

        finally

       

            try

           

                in.close();

            catch (Exception e)

           

           

            try

           

                out.close();

            catch (Exception e)

           

           

       

        return str_return;

   

PKIX 路径构建失败:我将证书添加到 carcert 仍然失败

【中文标题】PKIX 路径构建失败:我将证书添加到 carcert 仍然失败【英文标题】:PKIX path building failed : I added certificate to carcert still failing 【发布时间】:2021-03-13 11:58:39 【问题描述】:

我正面临 PKIX 路径构建失败的问题,这是我尝试过的......

    我访问了我想要访问的目标 URL

     (eg -> https://localdevchannel.master.info/Gate/CustomerManagement/rest/resources/search)
    

    我点击了“LOCK”图标并导出了证书。

    我在命令下运行...

    keytool -importcert -file sec.cer -storepass changeit -keystore "C:/Program Files/Java/jdk-11.0.2/jdk-11.0.2/lib/security/cacerts" -alias secCert

    证书放置成功。但我仍然面临这个问题。请帮助我做错了什么?

    javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    

【问题讨论】:

【参考方案1】:

好的,

如果您的证书已过期,或者您的商店中不存在,或者您更新了另一个 cacert 文件,并且您的 java/和/或应用程序正在查找/使用另一个文件,您会收到此异常。

1- 检查您的 cacert 文件以实际查看是否已添加 CERT 那里有它的别名。

在 JDK/jre/bin 中,您可以找到 keytool.exe 您可以像下面这样调用它来读取 cacerts 文件:

susan@SE-00018098 /c/Program Files/Java/jdk1.7.0_80/jre/bin

$ keytool.exe -list -keystore ../lib/security/cacerts
Enter keystore password:
Keystore type: jks
Keystore provider: SUN

Your keystore contains 92 entries

digicertassuredidrootca, 2008-apr-16, trustedCertEntry,
Certificate fingerprint (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43
trustcenterclass2caii, 2008-apr-29, trustedCertEntry,
Certificate fingerprint (SHA1): AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E
thawtepremiumserverca, 2009-dec-11, trustedCertEntry,
Certificate fingerprint (SHA1): E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66
swisssignplatinumg2ca, 2008-okt-31, trustedCertEntry,

2- 如果是,它是否已过期?检查日期。

3- 确认您的 app/java 运行时是否正在使用 cacert 文件 您刚刚更新(您是否安装了多个 Java 版本?您的 (Java_home) 是什么

======== 已编辑

如果证书存在且未过期,并且您 100% 确定它是正确的证书,那么您的应用程序/或容器可能没有查看 cacert 文件。

试试下面的 hack:我认为这是一个 hack,因为你正在硬编码 当您在不同的服务器上部署时可能存在/不存在的路径。

有很多方法可以创建自己的信任库和密钥库 并将它们放在应用程序本身中,然后您可以将它们合并到 您的代码,但请尝试查看其余代码是否有效。

在您的 https 连接代码之前设置系统属性:

System.setProperty("javax.net.ssl.trustStore", "java_home_path/jre/lib/security/cacerts");  

替换为cacerts文件的正确路径并尝试。

【讨论】:

有用的stackover流程***.com/questions/9619030/… 我有一个 Java_home :带有 jdk11 bin 的路径。 (因此不会出现多个 java 版本) 我试图打开 cacert 文件,不知道为什么该命令不起作用。密钥库“路径”-list 不起作用。 @horizo​​n,我更新了答案。密码变了 我明天会试试这个,然后告诉你。你有遇到过这样的事情吗?只是好奇?

以上是关于2018-02-08 HTTPS证书问题、PKIX或者证书过期问题解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Java生成证书工具类 InstallCert.java解决httpClient访问https出错:PKIX path building failed

Java# 请求https时证书不可信 PKIX SunCertPathBuilderException:unable to find valid certification....

HTTPS连接时出现PKIX path building failed问题

https开头的URL接口无法获取数据并报错: PKIX path building failed

PKIX 路径构建失败:无法找到请求目标的有效证书路径

SSLHandshakeException:PKIX 路径构建失败 SunCertPathBuilderException:无法找到请求目标的有效证书路径