SunCertPathBuilderException: unable to find valid certification path

超、凢脫俗 2023-06-06 07:53 107阅读 0赞

问题1

Project build error: Non-resolvable parent POM for com.example:test:0.0.1-SNAPSHOT: Failure to transfer org.springframework.boot:spring-
boot-starter-parent:pom:2.1.9.RELEASE from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be
reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact
org.springframework.boot:spring-boot-starter-parent:pom:2.1.9.RELEASE from/to central (https://repo.maven.apache.org/maven2):
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target and ‘parent.relativePath’ points at no local POM

在这里插入图片描述

解决方案1

访问 https://repo.maven.apache.org/maven2 ,由于 https的地址左侧都会有个锁标记(绿色代表有该证书合法,红色代表不合法),点击小锁,弹出对话框。在 “连接”栏,单击右侧箭头,显示连接细节
在这里插入图片描述
单击“更多信息”,弹出“页面信息”对话框
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191010122640396.png)切换到“安全”选项卡,点击"查看证书",弹出"证书查看器"对话框
在这里插入图片描述切换到“详细信息”选项卡,单击“导出”按钮导出证书。
在这里插入图片描述导出的是 crt 后缀的证书文件
在这里插入图片描述
以管理员身份打开cmd,进入到 C:\Program Files\Java\jdk1.8.0_201\jre\lib\security 目录下,执行命令 keytool -keystore cacerts -importcert -alias 【证书文件名】 -file 【crt文件路径】,这里会要求你输入口令,默认的口令是 changeit。

口令也可以通过 -storepass changeit 直接指定
证书文件别名按照原文件名即可, 我这里重命名了,导致导入不成功

在这里插入图片描述
最后会询问是否信任,直接回车即可。
在这里插入图片描述

解决方案2

创建一个 InstallCert.java类,添加如下代码

  1. package javaDemo;
  2. /*
  3. * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions
  7. * are met:
  8. *
  9. * - Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. *
  12. * - Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * - Neither the name of Sun Microsystems nor the names of its
  17. * contributors may be used to endorse or promote products derived
  18. * from this software without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  21. * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. import java.io.BufferedReader;
  33. import java.io.File;
  34. import java.io.FileInputStream;
  35. import java.io.FileOutputStream;
  36. import java.io.InputStream;
  37. import java.io.InputStreamReader;
  38. import java.io.OutputStream;
  39. import java.security.KeyStore;
  40. import java.security.MessageDigest;
  41. import java.security.cert.CertificateException;
  42. import java.security.cert.X509Certificate;
  43. import javax.net.ssl.SSLContext;
  44. import javax.net.ssl.SSLException;
  45. import javax.net.ssl.SSLSocket;
  46. import javax.net.ssl.SSLSocketFactory;
  47. import javax.net.ssl.TrustManager;
  48. import javax.net.ssl.TrustManagerFactory;
  49. import javax.net.ssl.X509TrustManager;
  50. public class InstallCert {
  51. public static void main(String[] args) throws Exception {
  52. String host;
  53. int port;
  54. char[] passphrase;
  55. if ((args.length == 1) || (args.length == 2)) {
  56. String[] c = args[0].split(":");
  57. host = c[0];
  58. port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
  59. String p = (args.length == 1) ? "changeit" : args[1];
  60. passphrase = p.toCharArray();
  61. } else {
  62. System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
  63. return;
  64. }
  65. File file = new File("jssecacerts");
  66. if (file.isFile() == false) {
  67. char SEP = File.separatorChar;
  68. File dir = new File(System.getProperty("java.home") + SEP + "lib"
  69. + SEP + "security");
  70. file = new File(dir, "jssecacerts");
  71. if (file.isFile() == false) {
  72. file = new File(dir, "cacerts");
  73. }
  74. }
  75. System.out.println("Loading KeyStore " + file + "...");
  76. InputStream in = new FileInputStream(file);
  77. KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  78. ks.load(in, passphrase);
  79. in.close();
  80. SSLContext context = SSLContext.getInstance("TLS");
  81. TrustManagerFactory tmf = TrustManagerFactory
  82. .getInstance(TrustManagerFactory.getDefaultAlgorithm());
  83. tmf.init(ks);
  84. X509TrustManager defaultTrustManager = (X509TrustManager) tmf
  85. .getTrustManagers()[0];
  86. SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
  87. context.init(null, new TrustManager[] { tm }, null);
  88. SSLSocketFactory factory = context.getSocketFactory();
  89. System.out
  90. .println("Opening connection to " + host + ":" + port + "...");
  91. SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
  92. socket.setSoTimeout(10000);
  93. try {
  94. System.out.println("Starting SSL handshake...");
  95. socket.startHandshake();
  96. socket.close();
  97. System.out.println();
  98. System.out.println("No errors, certificate is already trusted");
  99. } catch (SSLException e) {
  100. System.out.println();
  101. e.printStackTrace(System.out);
  102. }
  103. X509Certificate[] chain = tm.chain;
  104. if (chain == null) {
  105. System.out.println("Could not obtain server certificate chain");
  106. return;
  107. }
  108. BufferedReader reader = new BufferedReader(new InputStreamReader(
  109. System.in));
  110. System.out.println();
  111. System.out.println("Server sent " + chain.length + " certificate(s):");
  112. System.out.println();
  113. MessageDigest sha1 = MessageDigest.getInstance("SHA1");
  114. MessageDigest md5 = MessageDigest.getInstance("MD5");
  115. for (int i = 0; i < chain.length; i++) {
  116. X509Certificate cert = chain[i];
  117. System.out.println(" " + (i + 1) + " Subject "
  118. + cert.getSubjectDN());
  119. System.out.println(" Issuer " + cert.getIssuerDN());
  120. sha1.update(cert.getEncoded());
  121. System.out.println(" sha1 " + toHexString(sha1.digest()));
  122. md5.update(cert.getEncoded());
  123. System.out.println(" md5 " + toHexString(md5.digest()));
  124. System.out.println();
  125. }
  126. System.out
  127. .println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
  128. String line = reader.readLine().trim();
  129. int k;
  130. try {
  131. k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
  132. } catch (NumberFormatException e) {
  133. System.out.println("KeyStore not changed");
  134. return;
  135. }
  136. X509Certificate cert = chain[k];
  137. String alias = host + "-" + (k + 1);
  138. ks.setCertificateEntry(alias, cert);
  139. OutputStream out = new FileOutputStream("jssecacerts");
  140. ks.store(out, passphrase);
  141. out.close();
  142. System.out.println();
  143. System.out.println(cert);
  144. System.out.println();
  145. System.out
  146. .println("Added certificate to keystore 'jssecacerts' using alias '"
  147. + alias + "'");
  148. }
  149. private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
  150. private static String toHexString(byte[] bytes) {
  151. StringBuilder sb = new StringBuilder(bytes.length * 3);
  152. for (int b : bytes) {
  153. b &= 0xff;
  154. sb.append(HEXDIGITS[b >> 4]);
  155. sb.append(HEXDIGITS[b & 15]);
  156. sb.append(' ');
  157. }
  158. return sb.toString();
  159. }
  160. private static class SavingTrustManager implements X509TrustManager {
  161. private final X509TrustManager tm;
  162. private X509Certificate[] chain;
  163. SavingTrustManager(X509TrustManager tm) {
  164. this.tm = tm;
  165. }
  166. public X509Certificate[] getAcceptedIssuers() {
  167. throw new UnsupportedOperationException();
  168. }
  169. public void checkClientTrusted(X509Certificate[] chain, String authType)
  170. throws CertificateException {
  171. throw new UnsupportedOperationException();
  172. }
  173. public void checkServerTrusted(X509Certificate[] chain, String authType)
  174. throws CertificateException {
  175. this.chain = chain;
  176. tm.checkServerTrusted(chain, authType);
  177. }
  178. }
  179. }

在 run configurations 对话框中添加如下配置
在这里插入图片描述运行程序,会打印如下
在这里插入图片描述
直接回车即可
在这里插入图片描述
将证书拷贝到$JAVA_HOME/jre/lib/security目录下,重新编译即可

解决方案3

换一个 workspace,新建项目

问题2

Failure to transfer org.springframework.boot:spring-boot-maven-plugin:pom:2.1.6.RELEASE from https://repo.maven.apache.org/maven2 was cached in the
local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer
artifact org.springframework.boot:spring-boot-maven-plugin:pom:2.1.6.RELEASE from/to central (https://repo.maven.apache.org/maven2):
repo.maven.apache.org

解决方案

上面说明使用的是本地仓库缓存下来的包,但缓存的包有问题,因此只能删除 repository 目录下的所有的包,然后 clean 项目,让其重新构建了。

补充

如果不是公司装的代理服务器把证书换了导致不能访问。可能是当前版本的JDK太旧了,已不再支持,可以卸载,然后装一个新版的,装完之后重启电脑试试。

jre11 开始,安装 jdk 之后,虽然jdk自带 jre,但目录下却没有原本的 jre 文件夹,这导致很多依赖于 jre 的软件都无法正常运行。可以使用命令 bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre 在 jdk 目录下生成 jre 文件夹

发表评论

表情:
评论列表 (有 0 条评论,107人围观)

还没有评论,来说两句吧...

相关阅读