日常问题---unable to find valid certification path to requested target

Love The Way You Lie 2023-07-10 05:27 132阅读 0赞

问题:

unable to find valid certification path to requested target(找不到所请求目标的有效证书路径) 。

原因:

访问https协议网站时缺少安全证书。

解决:

  1. **1.把下面程序中注释处的https协议网站改成你要进行访问的https协议网站,然后运行。**
  2. /**
  3. * 生成访问https协议网站的证书
  4. */
  5. public class InstallCert {
  6. // 要进行访问的https网站
  7. public static final String hostName = "github.com";
  8. public static void main(String[] args) throws Exception {
  9. args = new String[] { hostName };
  10. String host;
  11. int port;
  12. char[] passphrase;
  13. if ((args.length == 1) || (args.length == 2)) {
  14. String[] c = args[0].split(":");
  15. host = c[0];
  16. port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
  17. String p = (args.length == 1) ? "changeit" : args[1];
  18. passphrase = p.toCharArray();
  19. } else {
  20. System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
  21. return;
  22. }
  23. File file = new File("jssecacerts");
  24. if (file.isFile() == false) {
  25. char SEP = File.separatorChar;
  26. File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security");
  27. file = new File(dir, "jssecacerts");
  28. if (file.isFile() == false) {
  29. file = new File(dir, "cacerts");
  30. }
  31. }
  32. System.out.println("Loading KeyStore " + file + "...");
  33. InputStream in = new FileInputStream(file);
  34. KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  35. ks.load(in, passphrase);
  36. in.close();
  37. SSLContext context = SSLContext.getInstance("TLS");
  38. TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  39. tmf.init(ks);
  40. X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
  41. SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
  42. context.init(null, new TrustManager[] { tm }, null);
  43. SSLSocketFactory factory = context.getSocketFactory();
  44. System.out.println("Opening connection to " + host + ":" + port + "...");
  45. SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
  46. socket.setSoTimeout(10000);
  47. try {
  48. System.out.println("Starting SSL handshake...");
  49. socket.startHandshake();
  50. socket.close();
  51. System.out.println();
  52. System.out.println("No errors, certificate is already trusted");
  53. } catch (SSLException e) {
  54. System.out.println();
  55. e.printStackTrace(System.out);
  56. }
  57. X509Certificate[] chain = tm.chain;
  58. if (chain == null) {
  59. System.out.println("Could not obtain server certificate chain");
  60. return;
  61. }
  62. BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  63. System.out.println();
  64. System.out.println("Server sent " + chain.length + " certificate(s):");
  65. System.out.println();
  66. MessageDigest sha1 = MessageDigest.getInstance("SHA1");
  67. MessageDigest md5 = MessageDigest.getInstance("MD5");
  68. for (int i = 0; i < chain.length; i++) {
  69. X509Certificate cert = chain[i];
  70. System.out.println(" " + (i + 1) + " Subject " + cert.getSubjectDN());
  71. System.out.println(" Issuer " + cert.getIssuerDN());
  72. sha1.update(cert.getEncoded());
  73. System.out.println(" sha1 " + toHexString(sha1.digest()));
  74. md5.update(cert.getEncoded());
  75. System.out.println(" md5 " + toHexString(md5.digest()));
  76. System.out.println();
  77. }
  78. System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
  79. String line = reader.readLine().trim();
  80. int k;
  81. try {
  82. k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
  83. } catch (NumberFormatException e) {
  84. System.out.println("KeyStore not changed");
  85. return;
  86. }
  87. X509Certificate cert = chain[k];
  88. String alias = host + "-" + (k + 1);
  89. ks.setCertificateEntry(alias, cert);
  90. OutputStream out = new FileOutputStream("jssecacerts");
  91. ks.store(out, passphrase);
  92. out.close();
  93. System.out.println();
  94. System.out.println(cert);
  95. System.out.println();
  96. System.out.println("Added certificate to keystore 'jssecacerts' using alias '" + alias + "'");
  97. }
  98. private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
  99. private static String toHexString(byte[] bytes) {
  100. StringBuilder sb = new StringBuilder(bytes.length * 3);
  101. for (int b : bytes) {
  102. b &= 0xff;
  103. sb.append(HEXDIGITS[b >> 4]);
  104. sb.append(HEXDIGITS[b & 15]);
  105. sb.append(' ');
  106. }
  107. return sb.toString();
  108. }
  109. private static class SavingTrustManager implements X509TrustManager {
  110. private final X509TrustManager tm;
  111. private X509Certificate[] chain;
  112. SavingTrustManager(X509TrustManager tm) {
  113. this.tm = tm;
  114. }
  115. public X509Certificate[] getAcceptedIssuers() {
  116. throw new UnsupportedOperationException();
  117. }
  118. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  119. throw new UnsupportedOperationException();
  120. }
  121. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  122. this.chain = chain;
  123. tm.checkServerTrusted(chain, authType);
  124. }
  125. }
  126. }

2.控制台出现报错不用管,在提示输入处,输入 1,然后回车,项目所在的文件夹下会出现证书jssecacerts

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTE1NDY5_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTE1NDY5_size_16_color_FFFFFF_t_70 1

3.将证书jssecacerts拷贝到 %JAVA_HONME%/jre/lib/security/下即可。

发表评论

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

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

相关阅读