Centos7使用certbot获取ssl证书

前言

之前的文章《NexT主题设置Valine评论系统邮件提醒》介绍了如何在Next主题中配置使用评论邮件提醒。其中主要介绍了一个由zhaojun1998提供的Valine-Admin邮件提醒系统。

由于之前本博客站点是部署在coding上的,并且配置了https的方式,所以在Valine-Admin中也是使用了https方式的请求方式。

而后来coding的黄金会员到期后,coding的静态 Pages服务就有coding的广告,而且导致Google收录无法验证本站点。所以重新购买了台ECS,将站点换到ECS上。而评论系统中使用了https,所以就打算将本站点配置成https的访问方式。

查阅了一些资料后,发现收费的SSL提供商收费基本是按 数千/年收费的,这就太昂贵了啊,所以最终决定使用Let’s Encrypt提供的免费SSL证书。虽说该证书只有90天有效期,但是可以设置定时任务进行更新。

本篇就记录下Let’s Encrypt的配置过程。

固件信息

服务器提供商:阿里云

系统:CentOS Linux release 7.5.1804

web服务:nginx/1.12.2

本地环境:Mac 10.13.6

博客站点:hexo

配置过程

在讲解配置过程前,先提醒大家将ECS磁盘创建快照,以便在配置出错且不知道如何恢复时可以方便地将系统回退。

创建快照的入口在:进入ECS实例详情 -> 点击左侧“本实例磁盘” -> 右侧磁盘列表上的“创建快照”按钮,即为该磁盘创建快照(备份)。

创建快照

接下来就具体介绍Let’s Encrypt相关的内容了。

certbot官网操作流程

SSL服务商Let’s Encrypt提供了通过certbot脚本申请证书的方式。

certbot官方地址为 https://certbot.eff.org/,Centos7+Nginx的配置方式地址为: https://certbot.eff.org/lets-encrypt/centosrhel7-nginx。也可以通过上面的地址选择对应的web服务和系统的配置方式。

按照官方提供的通过yum命令进行安装的方式,一直无法运行certbot --nginx,主要有如下问题:

依照上述issues中的结局方式,都无法解决该问题。最终只得通过先前创建的快照进行回退,使用了pip命令进行安装并成功配置。

pip安装

  • 安装certbot

    1
    pip install certbot
  • 安装certbot的nginx插件

    1
    pip install certbot-nginx
  • 自动配置nginx

    1
    certbot --nginx

    输入该命令后,会进行一些交互。

    1. 提示输入邮箱,该邮箱会收到ssl证书到期的邮件,所以请正确填写
    2. 许可信息确认,貌似输入 A就可以了, A表示agree,即同意他们的许可信息
    3. 提示是否将邮箱地址公开给Let’s Encrypt的相关组织,以便收到他们的一些邮件信息
    4. 会显示nginx当前已经配置的域名信息,不输入直接按回车键则表示列出的所有域名都配置成https方式;或者输入域名前面的序号并用空格或,进行分隔,则表示仅对选择的域名站点进行https配置
    5. 提示 是否将当前的http请求重定向为https请求,1:不重定向,2:重定向。我是选了(输入)2
    6. 操作成功

    这些交互,都有详细的提示,认真看,不难理解。

    这步之后,就可以使用https方式访问了。

    注:certbot --nginx命令运行过程中会自动读取配置的域名信息和修改nginx配置信息(上述步骤4和步骤5),如果nginx配置信息中有中文存在(注释中有中文也不行),步骤4中输入完成后会报错直接结束,无法到步骤5,错误信息如下哦:

    1
    certbot UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 2: ordinal not in range(128)

自动更新

certbot --nginx命令运行成功后,即可进行自动更新的配置。

由于Let’s Encrypt证书有效期只有90天,所以配置自动更新还是很有必要的。

在配置之前需要运行如下命令进行是否可以配置自动更新的检测。

1
certbot renew --dry-run

如果出现如下内容,则表示测试成功。不懂的话就看有没有Congratulations单词。

1
2
3
4
5
6
7
8
9
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** 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/www.nhtzj.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

cetbot官网上提示可以使用cron job或者systemd timer方式设置定时任务进行更新。

systemd timer方式

  • 进入/usr/lib/systemd/system

    1
    cd /usr/lib/systemd/system
  • 编辑certbot.service文件,如果没有该文件vim会创建该文件

    1
    vim certbot.service
  • 复制并黏贴以下内容,保存

    1
    2
    3
    4
    5
    6
    [Unit]
    Description=Let's Encrypt renewal

    [Service]
    Type=oneshot
    ExecStart=/usr/bin/certbot renew --quiet
  • 创建定时器文件

    1
    vim certbot.timer
  • 复制并黏贴一下内容,保存(官方推荐一天两次执行,以确保证书可用,这里选择0/12点)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [Unit]
    Description=Twice daily renewal of Let's Encrypt's certificates

    [Timer]
    OnCalendar=0/12:00:00
    RandomizedDelaySec=1h
    Persistent=true

    [Install]
    WantedBy=timers.target
  • 激活定时器(设为开机启动)

    1
    systemctl enable certbot.timer

    可以使用如下命令查看是否配置成功

    1
    2
    # systemctl is-enabled certbot.timer
    enabled

    enabled表示成功。

  • 启动定时

    1
    systemctl start certbot.timer

    到这步就配置成了。

cron job方式

在centos7 上可以利用crontab 来执行计划任务, 依赖与 crond 的系统服务,这个服务是系统自带的,可以直接查看状态,启动,停止。

本ECS上systemctl status crond命令显示crond.service服务处于活动状态。

1
2
3
4
# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-10-17 13:07:49 CST; 7h ago

利用crontab命令查看和设置定时任务。

crontab -u 用户名 -e

编辑用户的定时任务

-u :指定的执行的用户,默认为当前执行命令的用户

比如:

  • 通过Linux终端(Terminal)编辑crontab文件

    1
    crontab -e
  • 输入定时任务命令

    1
    2
    3
    #官网上的提示定时任务
    #会在每天0点和12点运行一遍
    0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

    或者自定义的任务

    1
    2
    # 每月1号5时执行执行一次更新,并重启nginx服务器
    00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

常用命令

更新证书(90天)

1
certbot renew

查看证书

1
certbot certificates

示例:

1
2
3
4
5
6
7
8
9
10
# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: 证书名称
Domains: blog.nhtzj.com unlock.nhtzj.com www.nhtzj.com
Expiry Date: 2021-04-23 11:29:35+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/证书名称/fullchain.pem
Private Key Path: /etc/letsencrypt/live/证书名称/privkey.pem

可以看到当前机器所有域名的证书情况,包括域名 到期日证书路径私钥路径四条信息。

新增域名

修改现有的证书,添加新的域名。

比如,你已经有一张域名是 www.nhtzj.com的 SSL 证书,想添加unlock.nhtzj.com,则可以使用下面的命令:

1
sudo certbot --expand -d www.nhtzj.com,unlock.nhtzj.com

域名之间要用逗号分隔。

参考

CentOS 7 使用certbot自动获取证书并配置nginx使用https

centos7.2 利用crontab执行定时计划任务

HTTPS 简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程

坚持原创技术分享,您的支持是对我最大的鼓励!