使用Nginx结合CertBot配置HTTPS协议

本文详细介绍HTTPS的工作原理,以及如何使用Let’sEncrypt和Certbot在Linux环境下自动部署和更新HTTPS证书,包括Nginx配置、证书生成、自动更新设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTPS 和 Let’s Encrypt、Certbot 的关系

其实 HTTPS 只是 HTTP 的一个拓展,是在 HTTP 的基础上利用 SSL/TLS 来加密数据包的。服务器会给客户端发送一个 Server certificates(服务证书),这个里面包含有服务器的一些信息,如域名、公司信息、序列号和签名信息组成等,这个证书可以个人生成,也可以由权威机构签发,当然个人的就不受大众信任,而权威机构签发的证书则会被信任。

而 CA 的证书提供商有许多个,有收费的有免费的,Let’s Encrypt 就是其中之一的免费提供商,它提供 90 天的免费授权,90 天后可以免费续签。要从 Let's Encript 获取某个域名的证书,需要证明你对该域名拥有控制权,对于该证明你可以使用某个使用 ACME 协议的软件来实现,而 Certbot 就是官方出的一个 ACME 客户端。

Certbot 安装

官网: https://certbot.eff.org

官方安装文档: https://certbot.eff.org/lets-encrypt/centosrhel7-nginx

Certbot 打包在 EPEL Enterprise Linux(企业版 Linux 的扩展包)上。使用 Certbot,必须先开启 EPEL 仓库。
在 RHEL 或 Oracle Linux 中,还要必须开启可选频道。可以执行如下命令安装 Certbot

sudo yum install epel-release
sudo yum install certbot

其实到这步 certbot 就算安装好了

生成证书

我们需要配置 Nginx 来做服务器域名验证,因为 CertBot 的 standalone 模式虽然可以配置好服务器,但是每次 90 天到期续签的时候,需要让服务停止一下,再启动。因此我们改用 Webroot 配置模式来验证,Webroot 配置模式下 CertBot 会生成一个随机文件,然后 CertBot 服务器通过 HTTP 的方式访问我们服务器上的这个文件进行验证。所以我们需要配置好 Nginx,以便 CertBot 服务器可以访问到这个随机文件。

修改 Nginx 配置,新增一个 server 模块:

    server {
        listen       80;
        server_name  your.domain.com; #这里填你要验证的域名

        location ^~ /.well-known/acme-challenge/ {
            default_type "text/plain";
            root     /usr/share/nginx/html/; #这里需要与后文 --webroot -w 后面配置的路径一致
        }
    }

ok,重启 Nginx

sudo service nginx reload

然后执行

sudo certbot certonly --webroot -w /usr/share/nginx/html/ -d your.domain.com

记得替换 your.domain.com 为你自己的域名。

如果看到有提示:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/your.domain.com/fullchain.pem. Your cert
   will expire on 20XX-09-23. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   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

证书生成成功!

接着可以开始启用 443 端口

修改 Nginx 的配置文件,新建一个 443 端口的 server 配置:

server {
    listen 443 ssl;
    listen [::]:443 ssl ipv6only=on;

    ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/your.domain.com/chain.pem;

    // ... other settings ...
}

记得替换 your.domain.com 为你自己的域名哦。

重启 Nginx

sudo service nginx reload

这时候的网站基本完成免费 HTTPS 证书的设置。成功!

删除证书

如果因为种种原因不小心生成了多余的证书,他会存在于我们的服务器中,导致无用的冗余。可是官方其实并没有提供取消授权的方式,我们可以在本地删除授权证书,并且不再续签,便可以释放该证书了,我们需要进入对应的文件夹内,查看自己已经生成的证书域名文件夹,然后依次删除就好,记得替换 your.domain.com 为你要删除的域名哦:

cd /etc/letsencrypt/live/
ls
sudo rm -rf /etc/letsencrypt/live/your.domain.com/ 
sudo rm -rf /etc/letsencrypt/archive/your.domain.com/
sudo rm /etc/letsencrypt/renewal/your.domain.com.conf

设置自动更新

由于这个免费证书的时效只有 90 天,所以我们需要设置自动更新,帮我们自动更新证书的时效。
自动更新可以使用 Linux 系统的 cron 定时任务功能,CentOS 可以使用 crontab 命令

我们先命令行模拟证书更新:

sudo certbot renew --dry-run

如果有提示下面的内容,表示模拟更新成功

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/your.domain.com.conf
-------------------------------------------------------------------------------
** 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/your.domain.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)

那么,我们就可以使用crontab -e的命令来启用自动任务,命令行:

sudo crontab -e

然后会打开打开定时任务配置文件,我们可以按i进入编辑模式,然后输入:

30 2 * * * /usr/bin/certbot renew  >> /var/log/le-renew.log

上面的执行时间为:每天凌晨2点30分执行renew任务。

现在可以在命令行执行/usr/bin/certbot renew >> /var/log/le-renew.log看看是否执行正常,如果一切OK,那么配置就成功了!大发!

定时任务时间设置

关于定时任务时间的设置,这里可以简单介绍下,定时任务格式如下:

 * * * * * command
分钟(0-59)小时(0-23)日期(1-31)月份(1-12)星期(0-6,0代表星期天)命令
*****command
    第1列表示分钟1~59 每分钟用*或者 */1表示
    第2列表示小时1~23(0表示0点)
    第3列表示日期1~31
    第4列表示月份1~12
    第5列标识号星期0~6(0表示星期天)
    第6列要运行的命令

在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 /< integer > 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理

使用实例

实例1:每1分钟执行一次command

* * * * * command

实例2:每小时的第3和第15分钟执行

3,15 * * * * command

实例3:在上午8点到11点的第3和第15分钟执行

3,15 8-11 * * * command

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

3,15 8-11 */2 * * command

实例5:每个星期一的上午8点到11点的第3和第15分钟执行

3,15 8-11 * * 1 command

实例6:每晚的21:30重启smb

30 21 * * * /etc/init.d/smb restart

实例7:每月1、10、22日的4 : 45重启smb

45 4 1,10,22 * * /etc/init.d/smb restart

实例8:每周六、周日的1 : 10重启smb

10 1 * * 6,0 /etc/init.d/smb restart

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb

0,30 18-23 * * * /etc/init.d/smb restart

实例10:每星期六的晚上11 : 00 pm重启smb

0 23 * * 6 /etc/init.d/smb restart

实例11:每一小时重启smb

* */1 * * * /etc/init.d/smb restart

实例12:晚上11点到早上7点之间,每隔一小时重启smb

* 23-7/1 * * * /etc/init.d/smb restart

实例13:每月的4号与每周一到周三的11点重启smb

0 11 4 * mon-wed /etc/init.d/smb restart

实例14:一月一号的4点重启smb

0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本

01   *   *   *   *     root run-parts /etc/cron.hourly
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值