jenkins 插件下载ssl证书问题

摘要:
学习技术的人最害怕遇到环境问题。一个小的环境问题可能需要几天的时间。嘿嘿,当我准备放弃和投降时,我找到了另一个解决以下Jenkins插件安装失败的方法。

Jenkins(2020年及以后版本,2.260以上)安装后,插件下载时失败,网上找了各种解决方法,修改jenkins插件的下载源地址:

找到菜单Manage Jenkins → Manage Plugins  → Advanced  → Update Site,

把URL改为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

或把默认地址 https://updates.jenkins.io/update-center.json 的https改为http再重启。

我把这些方法都试了以后,下载插件还是报错,心拨凉拨凉的。学技术的都最怕遇到环境问题,一个小环境问题可能要倒腾好几天。

嘿嘿,在我刚要选择投降放弃时,柳暗花明又一村,摸索到了以下Jenkins安装插件失败的另一种解决方法。

(Update Site的默认URL不需要动)

1.报错图:

jenkins 插件下载ssl证书问题第1张

报错的首行提示:sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

jenkins 插件下载ssl证书问题第2张

 报错原因:访问https的插件地址因为安全证书问题而报错。

2.解决方案:
1.先编译如下文件InstallCert.java
命令:javac InstallCert.java;

2.再运行InstallCert类,命令:java InstallCert <hostname>;出现提示后按1,回车。会生成jssecacerts 文件。
   PS:此处hostname 为 mirrors.tuna.tsinghua.edu.cn,国内jenkins下载插件的地址会重定向到清华大学提供的镜像文件库。
3.然后将生成的 jssecacerts 文件,拷贝到jdk中,目录位置:%JAVA_HOME%jrelibsecurity 
(例如 D:Program FilesJavajdk1.8.0_71jrelibsecurity)

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

免责声明:文章转载自《jenkins 插件下载ssl证书问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#: 通过html调用WinForm 。。。。。Window10下的Docker Desktop安装(保姆级教程)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

向github项目push代码后,Jenkins实现其自动构建

配置Jenkins(添加Github服务器) 1、进入【系统管理】 --> 【系统设置】 ,找到【Github】 2、添加Github服务器 这里需要github提供一个密钥文本,我们去github创建一个   创建成功后复制下面这一串,贴到Jenkins中 选择凭据后,点击连接测试,查看是否连接上github 创建测试任务(这里...

Jenkins 五: 构建Ant项目

1. 点击“新建”,在“Item名称”栏输入要构建的项目名,比如“Ant_project”,选择“构建一个自由风格的软件项目”,点击“OK”按钮。 2. 找到“源码管理”-> “Subversion”. 在 “Repository URL”栏输入源码地址。 3. 找到“ 构建”。点击 “增加构建步骤”,选择”Invoke Ant”。 在“Ant Ve...

Jenkins的Pipeline脚本在美团餐饮SaaS中的实践

一、背景 在日常开发中,我们经常会有发布需求,而且还会遇到各种环境,比如:线上环境(Online),模拟环境(Staging),开发环境(Dev)等。最简单的就是手动构建、上传服务器,但这种方式太过于繁琐,使用持续集成可以完美地解决这个问题,推荐了解一下Jenkins。Jenkins构建也有很多种方式,现在使用比较多的是自由风格的软件项目(Jenkins...

Windows环境Jenkins配置免密登录Linux

Windows免密登录可以提供很多便利,如Jenkins连接Linux等,批量启动集群等 1.首先,Windows机器安装ssh组件: 官网https://www.mls-software.com/opensshd.html下载,一路安装就行 安装可参考https://blog.csdn.net/wm609972715/article/details/83...

jenkins忘记管理员账号密码的补救方法

源引自:http://www.cnblogs.com/xiami303/p/3625829.html 一不小心,忘记了admin用户的账号密码。然后就看不到manage jenkins的那部分内容了,看不到就改不了用户权限,也就是系统瘫痪了。 于是,想着开始没注册账号和密码的时候,都能看见,也就是没有sign in 和sign up模块的时候,是可以使用的...

Jenkins 搭建篇

1.Jenkins 介绍   自动化运维工具:saltstack、jenkins、等。因为他们的目标一样,为了我们的软件、构建、测试、发布更加的敏捷、频繁、可靠   如果运维对git不熟,是无法做自动化部署。因为所有的项目都受制于开发 Jenkins官网:https://jenkins.io/ Jenkins是Java编写的,所以需要先安装JDK,这...