为 GitLab 启用 Let's Encrypt 颁发的 SSL 证书

Let's Encrypt 是一家全新的 SSL 证书颁发机构,为用户提供免费、自由、自动化的证书颁发流程。我们可以通过 Let's Encrypt 申请 SSL 证书来为我们的 GitLab 提供 HTTPS 接入。

安装 Let's Encrypt 客户端

首先,通过 git 下载 Let's Encrypt 的客户端:

git clone https://github.com/certbot/certbot cd certbot ./certbot-auto --help

(注:自 2016 年 5 月起,letsencrypt 项目改名为 certbot,letsencrypt-auto 工具改名为 certbot-auto。不过为了保持兼容性,克隆仓库时仍可使用 https://github.com/letsencrypt/letsencrypt,使用命令时也仍可用 letsencrypt-auto。)

申请证书

下载完 Let's Encrypt 客户端后,我们可以借助随 GitLab 启动的 nginx 服务器来验证我们的域名,进而获得证书。

./certbot-auto --agree-tos --email email@example.com certonly --webroot -w /opt/gitlab/embedded/service/gitlab-rails/public/ -d

上述命令中:

--agree-tos   同意用户协议。   --email   首次申请证书时,需要邮箱地址来创建 Let's Encrypt 的账号。不过,并不会验证此账号。   邮箱地址用于接受证书过期提醒。   certonly   只申请证书。   --webroot   通过在当前运行的 web 服务器下存放验证文件来验证身份。   -w   指定当前运行的 web 服务器的根目录。   对于通过 Omnibus 安装的 GitLab 的默认的 nginx 服务器的根目录位于 /opt/gitlab/embedded/service/gitlab-rails/public/。   -d   指定要申请证书的域名。  

证书申请成功后,会有类似如下输出:

Requesting root privileges to run certbot... /home/zzz.buzz/.local/share/letsencrypt/bin/letsencrypt --agree-tos --email email@example.com certonly --webroot -w /opt/gitlab/embedded/service/gitlab-rails/public/ -d Saving debug log to /var/log/letsencrypt/letsencrypt.log Performing the following challenges: http-01 challenge for Using the webroot path /opt/gitlab/embedded/service/gitlab-rails/public for all unmatched domains. Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/0001_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/0001_csr-certbot.pem IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.example.com/fullchain.pem. Your cert will expire on 2017-07-22. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

得到的证书及私钥存放在 /etc/letsencrypt/live/www.example.com/ 目录下,其中

cert.pem: 网站自身的证书;

chain.pem: 网站证书链中的上级证书;

fullchain.pem: 包含了网站自身证书和上级证书的完整证书链;

privkey.pem: 网站自身证书对应的私钥。

更新证书

由于证书的有效期为三个月,因此我们需要定时执行以下命令来更新证书:

./certbot-auto renew

注意如果证书还有较长时间才会过期,那么证书并不会得到更新,并会得到类似如下输出:

Requesting root privileges to run certbot... /home/zzz.buzz/.local/share/letsencrypt/bin/letsencrypt renew Saving debug log to /var/log/letsencrypt/letsencrypt.log ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/gitlab.zzz.buzz.conf ------------------------------------------------------------------------------- Cert not yet due for renewal The following certs are not due for renewal yet: /etc/letsencrypt/live/gitlab.zzz.buzz/fullchain.pem (skipped) No renewals were attempted.

而如果证书即将过期(有效期不足 20 天,10 天和 1 天时),用户却还未执行命令更新证书,那么 Let's Encrypt 会自动发邮件至申请证书时所留的邮件地址,提醒更新证书。

Let's Encrypt certificate expiration notice

更新完证书后,还需要让 nginx 重新加载新证书:

sudo gitlab-ctl hup nginx

除了手动执行外,也可以把以上命令加入 cron 任务来定时执行。

使用以下命令来编辑 cron 任务:

sudo su - crontab -e

在打开的文件中,添加以下内容:

0 3 * * 1 /home/zzz.buzz/certbot/certbot-auto renew && gitlab-ctl hup nginx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9b9c7639c7a71c819450aac5393e463e.html