本篇是解决Jenkins在某些机器下无法进行在线插件安装的问题。
关于Jenkins在Windows 的安装启动可以参考:
Jenkins 新版本及插件在Windows下的安装
问题:
Windows 10 系统下, Jenkins 2.7 之上的版本在线安装插件是失败, 在以下页面中会出现红色的错误标志。
点击具体错误详情, 会出现如下错误信息。
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
此外, 有时候会在插件管理页面出现一段红色的错误提示:
(注: 上图出现错误提示的页面, 非实际错误页面)
发生场景:
发生的场景一般是:
- 老版本的Jenkins一般不会出现, 较新版本会出现
- 个人电脑安装正常,但是在某些单位内网电脑会出现。
原因及解析:
从以上错误信息可以看出, 原因基本上是SSH 验证以及证书的原因。Jenkins 已经使用了https 的地址, 在插件管理的 “Advanced ” 标签页中可以看到:
也就是Jenkins插件在线获取的地址是: https://updates.jenkins.io/update-center.json。
Jenkins是使用Java实现的, Java在获取https 的时候会验证证书的有效性, 如果是非法的证书, 则不会下载相关的资源, 也就会报握手以及证书等错误信息。
解决方法:
网络上搜素有多种解法, 看上去较多的有:
- 方法1. 更换https 为 http, 也就是在“Advanced ” 标签页中修改https://updates.jenkins.io/update-center.json 为 http://updates.jenkins.io/update-center.json , 提交之后重启Jenkins。
- 方法2, 切换资源的地址为
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
, 使用清华大学提供的镜像资源地址。
不过, 笔者实验以上两种方法皆无效。 方法1 虽然可以解决 “Check Now”的错误信息, 但是实际下载资源的时候还是使用https, 方法2 更换资源地址, 还是没有解决证书的问题。
终极的解法是在Java添加证书的验证。
如何验证Java访问的站点时安全的
这里有一个Java的类SSLPoke , 使用其可以快速验证使用Java是否可以访问 某个https, 命令如下:
java SSLPoke updates.jenkins.io 443
- updates.jenkins.io 是地址
- 443 是https 的默认端口
如果出现如下“Successfully connected”代表成功, 否则会报异常。 否则就有很大可能是需要安装证书。
如何快速安装证书呢?
这里也有一个Java类 InstallCert.java
先编译该类:
javac InstallCert.java
在执行安装证书:
java InstallCert updates.jenkins.io
该命令会在目录产生一个 jssecacerts 的证书文件, 将这个文件复制到jre的目录中, 比如:
C:\Program Files\Java\jre1.8.0_211\lib\security
Jenkins插件下载的重定位
安装完 updates.jenkins.io 的证书之后, 发现下载插件依旧会出错, 查看日志发现如下错误信息:
Caused: java.io.IOException: Failed to download from https://updates.jenkins.io/download/plugins/mailer/1.34/mailer.hpi (redirected to: https://get.jenkins.io/plugins/mailer/1.34/mailer.hpi)
从以上错误信息可以看出, 下载插件时会被重定位到https://get.jenkins.io/plugins
, 所以也需要信任这个站点。
终极步骤
综合以上分析, 解决插件在线安装的步骤有:
- 下载 InstallCert.java 类, 并编译这个类
javac InstallCert.java
- 安装 updates.jenkins.io 站点的证书
java InstallCert updates.jenkins.io
- 安装 get.jenkins.io 站点的证书
java InstallCert get.jenkins.io
- 重启Jenkins
本篇介绍的所有资源及工具的下载地址
问题解决心得
- 善用日志
- 思考文本的根本原因,找准问题根源, 这个问题完全是Java的https访问的证书验证问题, 如果把焦点一直放在Jenkins本身,则就是缘木求鱼了。