本篇面临与解决的问题
本篇是在 Windows 10中安装Jenkins 2.414.1 , 在安装完成之后安装一些需要的插件, 可以在浏览器端安装插件的时候, 总是不成功, 控制台报以下错误:
SEVERE h.model.UpdateCenter$DownloadJob#run: Failed to install antisamy-markup-formatter
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)
at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:127)
at java.base/java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297)
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:434)
Caused: sun.security.validator.ValidatorException: PKIX path building failed
at java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439)
at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)
at java.base/sun.security.validator.Validator.validate(Validator.java:264)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:132)
at java.base/sun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:638)
Caused: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
一句话, 还是 https 证书的问题。
之前有总结一篇如何解决这个问题, 参考:
Jenkins 在Windows下插件无法安装问题解决
但是,按照这个方式处理之后,问题还是依旧。
难道是证书导入的不对吗?
使用SSLPoke 查看Java是否能访问插件的 https, 发现都是正常的, 命令如下:
java SSLPoke updates.jenkins.io 443
java SSLPoke get.jenkins.io 443
返回都是:
Successfully connected
也就是说, 证书导入之后, Java访问是正常的, 但是Jenkins 却无法下载插件。
是因为Jenkins无法找到证书库吗, 于是在启动的时候使用 javax.net.ssl.keyStore
指定证书库文件, 命令如下:
java -Djavax.net.ssl.keyStore="C:\Program Files\Java\xx\lib\security\cacerts" -storepass changeit -jar jenkins.war
问题还是依旧,于是想着:
是否可以让Jenkins 忽略证书访问呢? 使用 hudson.model.DownloadService.noSignatureCheck
参数设置下载的时候忽略证书:如下:
java -Dhudson.model.DownloadService.noSignatureCheck=true -jar jenkins.war
实验结果: 失败。
解决方案
在启动的后台终端看到如下一条提示:
Caused: java.io.IOException: Failed to download from https://updates.jenkins.io/download/plugins/cloudbees-folder/6.848.ve3b_fd7839a_81/cloudbees-folder.hpi (redirected to: https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/cloudbees-folder/6.848.ve3b_fd7839a_81/cloudbees-folder.hpi)
看这条的意思是: 从官方下载失败了, 重定向到清华大学的镜像。这时脑海闪过一个死马当成活马医的想法, 导入 清华大学的镜像的证书试试:
- 在浏览器打开 https://mirrors.tuna.tsinghua.edu.cn/
- 下载证书
- 导入证书
- 到Jenkins中安装插件
惊喜出现了, 竟然可以了。 下载的插件文件位于:C:\Users\xxx.jenkins\plugins。安装完成就可以使用, 不需要重启。
本篇相关的环境搭建
- JDK 17 ,OpenJDK,下载地址: https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_windows-x64_bin.zip
- Jenkins 2.414.1,长期支持版本。
Jennkins从 Jenkins 2.357 和 LTS 2.361.1版本之后需要JDK 11 或者JDK 17之上的版本。
这里的JDK是解压版,不需要安装, 解压后将目录jdk-17.0.2 复制到C:\Program Files\Java 下,如果机器有其他版本的Java, 复制后的目录结构如下:
修改JAVA_HOME 以及Path 环境变量, 使机器使用 JDK 17, 也可以临时设置,需要注意的是Path默认会有一个值 C:\Program Files (x86)\Common Files\Oracle\Java\javapath
, 修改Java版本的时候要注意这个。
本篇相关的JDK, Jenkins 以及常用插件可以通过以下地址一键下载:
https://download.csdn.net/download/oscar999/88354562
Jenkins 安装成功后的页面如下:
关于内部根证书
在企业环境中,经常需要使用根证书对外部证书进行包装和签名,来创建所谓的“代理证书”或“包装证书”。这些证书提供了额外的验证和安全性,可以增加一层来自企业内部的信任。
在这种设置中,一般情况的流程如下:
-
创建或引入企业根证书:企业首先需要有一个被内部服务器、设备和用户所信任的根证书。这可以是自签名的,也可以是从商业或公开的认证颁发机构购买的。
-
创建证书签名请求(CSR):对于需要签名的外部证书,您需要先创建一个与该证书相关联的 CSR。这通常涉及到输入一些相关信息,例如您的组织和服务器的名称、位置等。
-
使用根证书签名 CSR:然后,您可以使用您的企业根证书签名 CSR,创建一个新的服务器证书。这个新的证书是原来的外部证书的“包装版”,它现在包含了来自您的企业的签名。
-
在服务器上使用新的证书:最后,您可以在您的服务器上使用这个新的被签名的证书,代替原先的外部证书。
证书的验证
内部根证书所签发的其他证书需要进行以下步骤:
-
检查证书链: 首先检查证书的签名链是否完整。一个证书应该能够在证书链中向上追溯到其签发的根证书。在一个浏览器环境中,它会自动执行这个过程。
-
验证根证书: 根证书需要被特定应用或操作系统信任。如果根证书是内部私有证书,那么它同样需要被手动安装在受信任的根证书存储中。
-
检查证书的有效期: 检查证书是否在有效期内。证书都有一个开始日期和一个到期日期,并且仅在这段时间内有效。
-
查找证书撤销列表(CRL)或者在线证书状态协议(OCSP): 证书可能在它的有效期内被撤销。验证过程需要检查证书是否已被撤销。
-
验证证书的使用目的: 验证证书是否被用于它被设计的用途。例如,服务器证书必须用于 SSL/TLS 通信。
具体的验证步骤可能因环境和具体的需求来变化。在编程环境中,这些验证步骤可能需要自己去实现,或者是使用第三方库来完成。在浏览器和操作系统环境中,这些步骤通常是自动进行的。
自有根证书可能的问题
使用自有的根证书,并发现无法正常访问外部站点,这可能由多个原因导致:
代理或防火墙设置: 你的网络可能有一个代理服务器或防火墙,这些可能需要特殊证书来建立安全连接。如果你的设备没有安装正确的证书,可能不能访问外部网站。你可能需要联系你的IT部门来获取并安装正确的证书。
证书权限: 有可能你的根证书或者中间证书并不允许你的设备访问外部资源。你可能需要检查你的根证书的权限设置,或者联系你的IT部门寻求解决办法。
证书链问题: 如果你的证书链有问题,可能会阻止你的设备成功的对外部网站进行TLS握手。这可能是因为证书链缺失,或者你的企业的根证书没有正确的签名外部资源的证书。
这里可能的问题就是本篇开篇遇到的问题了。