如何在Ubuntu 16.04上使用Let加密SSL证书配置GoCD

介绍

GoCD是一个功能强大的持续集成和交付平台,旨在自动化测试和发布流程。GoCD具有许多高级功能,例如比较构建,可视化复杂工作流以及自动构建版本跟踪,是一种灵活的工具,可以帮助团队将经过良好测试的软件提供给生产环境。

在本指南中,我们将配置GoCD使用受信任的Let的加密SSL证书,以防止在访问Web界面时出现浏览器警告。我们将提供两种不同配置的说明。

第一种方法是将Nginx Web服务器安装为反向代理,这将转发连接到GoCD的HTTP端点。这种选择提供了更加无缝的Let's加密体验,可能是大多数人的最佳选择。

我们将讨论的第二种方法是从Let's Encrypt获取证书,然后切换GoCD的HTTPS端点使用的证书。虽然这消除了对单独的Web服务器的需求,可能节省资源,但GoCD使用Java密钥库SSL证书存储库,该存储库与Let的加密提供的证书格式不直接兼容。我们需要创建一个脚本,以便每次续订时自动将证书转换为预期的格式。如果您的服务器具有最少的资源并且您想要分配GoCD本身可用的所有内容,则此选项最佳。

要完成本教程,您需要具备以下内容:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。
  • SSL证书:如何设置此证书取决于您是否拥有可解析该服务器的域名。

准备

如果您还没有在Ubuntu 16.04上配置GoCD服务器,则需要在开始本指南之前配置一个。基本服务器至少需要2G RAM和2个CPU核心。GoCD还需要专用分区或磁盘来用于工件存储。

设置服务器后,您需要执行一些初始配置并安装GoCD。

要从Let's Encrypt获取SSL证书,您的服务器需要拥有域名

进一步的要求取决于您想要采用的方法,并将在相应的章节中进行说明。准备好继续后,选择要使用的方法并按照相关说明进行操作。

选项1:将Nginx配置为GoCD的反向代理

如果您想将Nginx设置为GoCD的SSL终止反向代理,请按照本节进行操作。在此配置中,Nginx将配置为使用Let's Encrypt的加密证书为HTTPS流量提供服务。它将解密客户端连接,然后使用常规HTTP将流量转发到GoCD的Web界面。这需要Nginx前端的一些额外开销,但这是一种更直接的方法。

其他要求

如果您想使用Nginx作为GoCD的反向代理,您首先需要安装Nginx和Let的加密客户端,然后为您的域申请证书。

完成操作后,您仍然可以通过访问https://your_domain:8154使用自签名证书访问GoCD,并在删除端口规范时使用Let的加密证书显示默认的Nginx页面。

现在,我们可以配置Nginx来代理对GoCD后端的请求,以便使用Let的加密证书对客户端连接进行加密。

配置Nginx到Proxy到GoCD的HTTP Web界面

我们从Let's Encrypt下载了SSL证书,并配置了Nginx,以便在默认SSL端口上提供请求时使用该证书。我们的下一步是配置Nginx将这些请求代理到GoCD的常规HTTP Web界面,这可在端口8153上获得。

首先,打开配置为使用Let的加密证书的默认Nginx服务器块文件:

sudo nano /etc/nginx/sites-available/default

在文件顶部,在server块之外,打开一个新的upsteam部分。我们将调用此gocd块,以便我们以后可以轻松识别它。在内部,指定Nginx可用于联系GoCD的HTTP接口的地址。在我们的例子中,这将使用本地环回设备,因此完整地址应为127.0.0.1:8153

upstream gocd {
    server 127.0.0.1:8153;
}
​
server {
    . . .

接下来,在server块中,找到location /块。在里面,注释掉try_files指令,以便我们可以指定我们的代理配置。代替该try_files行,使用http://协议将代理传递添加到我们定义的上游gocd。包括该proxy_params文件以设置我们的位置块所需的其他代理设置:

. . .
​
server
    . . .
​
    location / {
        #try_files $uri $uri/ =404;
        proxy_pass http://gocd;
        include proxy_params;
    }
​
    . . .

完成后保存并关闭文件。

返回命令行后,键入以下命令检查Nginx配置是否存在语法错误:

sudo nginx -t

如果未找到任何错误,请键入以下命令重新启动Nginx服务:

sudo systemctl restart nginx

您的GoCD Web UI现在可以通过您的常规域名和https://协议进行访问。

注意:虽然我们通过Nginx代理端口80和443上的请求,但我们仍需要在防火墙中保持8154 HTTPS端口打开。GoCD代理需要能够直接联系GoCD服务器(没有代理),因此服务器可以直接验证客户端的SSL证书。保持打开端口8154将允许外部代理正确地联系服务器,而通过浏览器的常规Web请求可以通过代理。

我们需要调整的最后一项是GoCD网络用户界面中的网站网址设置。

更新GoCD站点URL以使用新地址

一旦重新启动Nginx,唯一剩下的任务就是修改GoCD在内部使用以构建适当链接的站点URL设置。

在Web浏览器中访问您的GoCD服务器域,并在必要时登录:

https://example.com

接下来,单击顶部菜单栏中的ADMIN,然后从下拉菜单中选择Server Configuration

在“ 服务器管理”部分中,修改“ 站点URL”以从末尾删除:8154端口规范。如果您之前使用的是IP地址而不是域名,请更改URL以使用您的域名:

向下滚动到页面底部,然后单击“ 保存 ”立即实施更改。您的网站现已设置为通过Nginx将所有域名请求代理到GoCD网络用户界面。

选项2:配置GoCD的本机SSL以使用Let的加密证书

如果您要将GoCD自己的Web服务器配置为使用Let的加密证书,请按照此部分进行操作。在此配置中,我们将使用Let's Encrypt提供的可信证书替换GoCD服务器已使用的自签名证书。但要做到这一点,我们需要将证书文件转换为新格式并将它们导入Java密钥库文件。我们将创建一个脚本,以便每次续订证书文件时都可以重复该过程。

其他要求

如果您希望从GoCD本身处理所有SSL操作,则需要在没有Web服务器配置过程的情况下从Let's Encrypt下载证书。您可以跳过设置自动续订的步骤,因为我们将创建一个在此过程中运行的特定脚本。

完成上述操作后,您仍然可以通过访问https://your_domain:8154使用自签名证书访问GoCD,并且/etc/letsencrypt/live/your_domain目录中应该提供Let's Encrypt提供的证书文件。

创建证书转换脚本

GoCD使用Java密钥库来处理SSL证书。不幸的是,这与Let的加密使用的格式不同。要使用GoCD的Let's加密证书,我们必须使用非常具体的程序进行转换。

由于程序的复杂性以及我们每次更新证书时需要转换证书,我们将创建一个脚本来自动执行该过程。在/usr/local/bin目录中,在文本编辑器中创建并打开convert_certs_for_gocd.sh脚本:

sudo nano /usr/local/bin/convert_certs_for_gocd.sh

在里面,粘贴以下脚本。您需要更新的唯一设置是base_domain变量的值。将其设置为GoCD服务器的域名(这应该与/etc/letsencrypt/live/中目录的值匹配):

#!/bin/bash
​
base_domain="example.com"
le_directory="/etc/letsencrypt/live/${base_domain}"
working_dir="$(mktemp -d)"
gocd_pass="serverKeystorepa55w0rd"
​
​
clean_up () {
    rm -rf "${working_dir}"
}
​
# Use this to echo to standard error
error () {
    printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2
    clean_up
    exit 1
}
​
trap 'error "An unexpected error occurred."' ERR
​
copy_cert_files () {
    cp "${le_directory}/fullchain.pem" "${working_dir}"
    cp "${le_directory}/privkey.pem" "${working_dir}"
}
​
convert_to_pkcs12 () {
    openssl_pkcs12_args=(
        "pkcs12"
        "-inkey" "${working_dir}/privkey.pem"
        "-in" "${working_dir}/fullchain.pem"
        "-export"
        "-out" "${working_dir}/${base_domain}.crt.pkcs12"
        "-passout" "pass:${gocd_pass}"
    )
    openssl "${openssl_pkcs12_args[@]}"
}
​
import_to_keytool () {
    keytool_args=(
        "-importkeystore"
        "-srckeystore" "${working_dir}/${base_domain}.crt.pkcs12"
        "-srcstoretype" "PKCS12"
        "-srcstorepass" "${gocd_pass}"
        "-destkeystore" "${working_dir}/keystore"
        "-srcalias" "1"
        "-destalias" "cruise"
        "-deststorepass" "${gocd_pass}"
        "-destkeypass" "${gocd_pass}"
    )
    keytool "${keytool_args[@]}"
}
​
install_new_keystore () {
    cp /etc/go/keystore /etc/go/keystore.bak
    mv "${working_dir}/keystore" "/etc/go/keystore"
    chown go:go /etc/go/keystore
    systemctl restart go-server
}
​
if (( EUID != 0 )); then
    error "This script requires root privileges"
fi
​
copy_cert_files && convert_to_pkcs12 && import_to_keytool && install_new_keystore && clean_up

让我们仔细看看这个脚本正在做什么。

在开始时,我们设置了一些变量来帮助我们的脚本更容易使用。我们为要转换的证书设置域名,并将变量扩展为Let的加密证书目录。我们使用mktemp命令创建一个临时工作目录,并将值分配给另一个变量。GoCD要求所有的Java密钥库的密码都是serverKeystorepa55w0rd,我们设置另一个变量来保存该值。

接下来,我们定义一个在调用时删除临时目录的函数。我们在脚本末尾使用它来清理自己以及发生任何意外错误时。为了实现第二种可能性,我们创建了另一个显示错误消息的函数,并在退出之前进行清理。每当出现错误时,我们都会使用trap命令自动调用此函数。

然后,我们创建执行实际转换的函数。第一个函数通过将私钥和完整链证书复制到工作目录来设置我们的工作区。convert_to_pkcs12函数用openssl来将完整链证书文件和私钥文件加入keytool使用的组合PKCS 12文件中。此过程需要导出密码,因此我们使用GoCD密码变量。

下一个函数将新的PKCS 12文件导入Java密钥库文件。我们导入文件并提供导出密码。然后,我们为密钥库文件的各种密码提供相同的密码。最后,最后一个函数将新文件keystore复制到/etc/go目录中(在备份旧文件keystore后),调整文件所有权,然后重新启动GoCD服务器。

在脚本结束时,我们通过检查有效用户ID是否为“0”来检查是否使用适当的权限调用脚本,这意味着“具有与root相同的权限”。然后以适当的顺序调用函数以正确转换证书并安装新的keystore文件。

完成后,保存并关闭文件以继续。

执行初始转换

现在我们有了转换脚本,我们应该使用它来执行初始证书转换。

首先,将脚本标记为可执行文件,以便可以直接执行它而无需调用解释器:

sudo chmod +x /usr/local/bin/convert_certs_for_gocd.sh

现在,使用sudo权限调用脚本来执行初始转换,安装生成的keystore文件,然后重新启动GoCD进程

sudo /usr/local/bin/convert_certs_for_gocd.sh

由于GoCD服务器必须重新启动,因此该过程可能需要一些时间。脚本完成后,可能需要一两个时间才能使服务器准备好侦听连接。您可以键入以下内容来查看应用程序当前正在使用的端口:

sudo watch netstat -plnt

此视图将以两秒刷新率显示应用程序当前正在侦听的TCP端口。当GoCD开始侦听端口8153和8154时,屏幕应如下所示:

Output
Every 2.0s: netstat -plnt                                    Thu Jul 27 20:16:20 2017
​
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1736/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1736/sshd
tcp6       0      0 :::8153                 :::*                    LISTEN      8942/java
tcp6       0      0 :::8154                 :::*                    LISTEN      8942/java

一旦存在端口8153和8154,按CTRL-C退出显示。

应用程序开始侦听连接后,通过使用HTTPS访问端口8154上的GoCD域来检查Web界面:

https://example.com:8154

以前,当访问此页面时,地址栏中的图标表示证书无法信任(请注意,您的浏览器的可视指示器可能不同):

您第一次访问时,可能需要在浏览器中单击警告屏幕:

现在我们已经使用Let's Encrypt提供的可信证书替换了自签名证书,浏览器将指示证书是可信的,用户不必绕过浏览器警告来访问该站点。请注意,在关闭当前选项卡,窗口或会话之前,浏览器可能会缓存以前的证书:

这意味着GoCD能够使用我们转换的Let's Encrypt证书。

设置自动续订挂钩

现在我们已经验证了我们的脚本正确转换了证书资产,我们可以确保每次续订证书时都调用我们的脚本certbot

键入以下命令,在目录/etc/letsencrypt/renewal中打开域的续订配置文件:

sudo nano /etc/letsencrypt/renewal/example.com.conf

在内部,在[renewalparams]文件的部分中,将行设置renew_hook添加到脚本的位置:

. . .
[renewalparams]
. . .
renew_hook = /usr/local/bin/convert_certs_for_gocd.sh

certbot软件安装一个cron作业,检查是否应该每天更新两次证书。续订证书后,renew_hook将运行指定的脚本。这样,我们可以确保GoCD始终使用从Let's Encrypt获取的最新有效证书。

完成后保存并关闭文件。

您可以通过执行续订过程的干运行来测试您没有向文件中引入任何语法错误。请注意,这不会运行我们的证书转换脚本,但会打印出有关它被跳过的通知:

sudo certbot renew --dry-run
Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log
​
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Dry run: skipping renewal hook command: /usr/local/bin/convert_certs_for_gocd.sh
​
-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/example.com/fullchain.pem
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)
​
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

上述输出验证我们所做的更改并未阻止证书续订。输出还指示续订挂钩指向正确的脚本位置。

结论

在本指南中,我们介绍了使用Let's Encrypt中的受信任SSL证书保护GoCD安装的两种不同方法。第一种方法是使用Nginx设置证书,然后将流量代理到GoCD的Web界面。第二个选项将Let的加密证书文件转换为PKCS 12格式,并将它们导入到Java密钥库文件中,供本地GoCD使用。这两个选项都使用可靠的证书保护GoCD的Web界面,但他们使用不同的策略和独特的权衡来实现这一点。适合您的方法在很大程度上取决于您团队的要求和目标。

想要了解更多关于使用Let加密SSL证书配置GoCD的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How To Configure GoCD with Let's Encrypt SSL Certificates on Ubuntu 16.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JackeyGao的博客

Django OAuth2 和 JWT 案例

在重写 Ansible 监控平台时, 需要前后端分离, 并且需要使用公司的账户系统。 而前后端认证我一直采取的 JWT 认证规范,具体为什么这么选择, 这里不多...

19740
来自专栏云计算教程系列

如何在Debian 9上为Nginx创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

42130
来自专栏PHP在线

JWT实现token-based会话管理

上文《3种web会话管理的方式》介绍了3种会话管理的方式,其中token-based的方式有必要从实现层面了解一下。本文主要介绍这方面的内容。上文提到token...

13920
来自专栏魏艾斯博客www.vpsss.net

Xshell 用 SSH 密钥登录服务器的配置过程

3.6K40
来自专栏云计算教程系列

如何在Ubuntu 16.04中为Nginx创建自签名SSL证书

TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

57400
来自专栏闻道于事

前后端分离之JWT用户认证(转)

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个requ...

25410
来自专栏向治洪

Android开发中的安全

根据Android四大框架来解说安全机制 代码安全 java不同于C/C++,java是解释性语言,存在代码被反编译的隐患; 默认混淆器为progua...

20990
来自专栏技术博文

ssh password and passphrase

ssh password and passphrase 1、ssh-keygen -t rsa     采用默认路径,输入passphrase。  2、scp ...

45160
来自专栏张戈的专栏

Linux+Nginx/Apache/Tomcat新增SSL证书,开启https访问教程

上上篇文章《nginx 平滑升级&新增模块》提到了公司的 https 访问需求。当我新增了 SSL 模块之后,却发现以前还真没部署过 https 访问。 下面整...

1.1K70
来自专栏琦小虾的Binary

Ubuntu 14.04 LTS 下安装Adobe Flash Player

Ubuntu 14.04 LTS 下安装Adobe Flash Player 一、安装FireFox浏览器的Adobe Flash Player插件 直接在Ub...

23060

扫码关注云+社区

领取腾讯云代金券