1. 概述

Jenkins 是一个基于 Java 的开源且易于使用的 Web 服务器,通常用于持续集成和持续交付(CI/CD)管道的开发。

在本教程中,我们将通过配置 SSL 来指导您完成在 Jenkins 服务器上启用 HTTPS 的过程。

2. 使用 Jenkins SSL 配置

为了使用 HTTPS,我们需要更改我们 Jenkins 服务器内部的 SSL 设置。

2.1. 生成 SSL 证书

首先,我们需要生成 SSL 证书和密钥库。在这里,我们将使用 OpenSSL 创建两者。

让我们先在 CentOS 机器上安装 OpenSSL:

$ sudo yum install openssl

下一步,我们将使用 OpenSSL 工具生成 SSL 公钥和私钥:

$ openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem
Generating an RSA private key
.....................................+++++
..................+++++
writing new private key to 'key.pem'
Email Address []:

这里,key.pem 密钥和 certificate.pem 自签名证书被生成。接下来,让我们通过将这两个文件转换为 .p12 keystore 来合并它们:

$ openssl pkcs12 -inkey key.pem -in certificate.pem -export -out certificate.p12

重要的是,之后我们可以使用这两个 .pem 文件,所以我们可能想要保存它们。现在,让我们使用 keytool 导入 .p12 文件并将它转换成 .jks keystore

$ keytool -importkeystore -srckeystore ./certificate.p12 -srcstoretype pkcs12 -destkeystore jenkinsserver.jks -deststoretype JKS
Entry for alias 1 successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled
Warning:

现在,我们可以使用 jenkinsserver.jks 在 Jenkins 配置中。

2.2. 将 JKS 文件添加到 Jenkins 路径

重要的是,我们需要确保 jenkinsserver.jks 可以被 Jenkins 访问JENKINS_HOME(通常是 /var/lib/jenkins) 是一个不错的选择:

$ sudo cp jenkinsserver.jks /var/lib/jenkins/

路径 /var/lib/jenkins/ 默认对 jenkins 用户是可访问的。然而,我们需要更改 .jks 文件的所有权

$ sudo chown jenkins:jenkins /var/lib/jenkins/jenkins.jks

现在,Jenkins 已设置为安全 SSL 认证的正确 keystore 文件。

2.3. 配置 Jenkins 进行 SSL 通信

**为了将 Jenkins 设置为使用 SSL,我们需要使用 HTTPS keystore、HTTPS 端口和密码**。让我们使用 /etc/systemd/system/jenkins.service 文件中的变量来设置每个:

Environment="JENKINS_HTTPS_PORT=8443"
Environment="JENKINS_HTTPS_KEYSTORE=/var/lib/jenkins/jenkinsserver.jks"
Environment="JENKINS_HTTPS_KEYSTORE_PASSWORD=baeldung"

到此为止,Jenkins 中已设置了 HTTPS。

2.4. 重启 Jenkins 服务

到目前为止,我们已经完成了所有配置更改。为了应用这些更改,我们需要重新加载守护进程并重启 Jenkins:

$ sudo systemctl daemon-reload
$ sudo systemctl restart jenkins.service 

现在,Jenkins 服务器的 SSL 证书已激活。因此,HTTPS 正在运行,确保数据安全。

2.5. Jenkins 服务器验证

当然,Jenkins 现在可以通过 HTTP 和 HTTPS 访问。为了说明这一点,让我们通过 HTTPS 端口访问 Jenkins 服务器:

jenkins ssl

我们可以看到,Jenkins 服务器正在 8443 端口上使用 HTTPS 运行,由 SSL 安全。

3. 使用反向代理

**我们也可以在主要的 Jenkins 服务器前面运行一个 *反向代理服务器*,以增加安全性**。此外,在 HAProxy 等后端提供更友好的 URL,可以作为更安全的访问方式。代理是一种防火墙,进一步保护对后端服务器的访问。

我们可以运行 HAProxy、Nginx、Apache 或 Squid 作为我们的代理服务器。这里,我们使用 HAProxy 作为相对标准的选择。

3.1. 安装和配置 HAProxy

使用 HAProxy,我们可以将请求重定向到 Jenkins。让我们在 Linux 机器上安装 HAProxy:

$ yum install haproxy

接下来,让我们更改一些默认设置。首先,我们将创建一个前端节点,监听所有连接:

frontend http-in
    bind *:80
    bind *:443 ssl crt /etc/haproxy/haproxy.pem
    mode http
    use_backend jenkins if { path_beg / }

在这里,重定向去往通过 use_backend 的 Jenkins 后端。当然,我们必须在配置中添加一个 Jenkins 后端节点,以便 HAProxy 正确地转发:

backend jenkins
    server jenkins1 127.0.0.1:8080

上面,我们使用了 haproxy.pem 文件,这很容易创建:

$ cat certificate.pem key.pem > haproxy.pem

这里,我们将之前生成的 certificate.pemkey.pem 合并以生成 haproxy.pem 文件。最后,让我们重新加载守护进程并重启 haproxy 服务:

$ sudo systemctl daemon-reload
$ sudo systemctl restart haproxy

到此为止,通过 HAProxy,Jenkins 服务器上的 SSL 应该可用。

3.2. 验证

到目前为止,HAProxy 应该已经启动并运行,将请求重定向到 Jenkins。为了说明这一点,让我们访问 Jenkins 服务器并验证 HTTPS 连接:

jenkins haproxy

如图所示,Jenkins 使用 HTTPS 进行安全访问,无需自定义端口。

4. 总结

在这篇文章中,我们遵循步骤在 Jenkins 服务器上启用了 SSL 安全。最初,我们学习了如何配置 Jenkins 自身的 HTTPS 设置。最后,为了进一步确保 SSL 连接的安全性,我们添加了一个反向代理服务器,将 Jenkins 作为后端。