Let's Encrypt 是一个证书颁发机构(CA),它使你能够获取和安装免费TLS/SSL证书,从而为 web 服务器启用加密HTTPS。它提供软件客户端 Certbot 来获取和安装免费TLS/SSL证书,该客户端能够自动完成获取和安装免费TLS/SSL证书大多数(如果不是全部的话)所需的步骤。目前,在Apache和Nginx上,获取和安装 SSL 证书的整个过程都是完全自动化的。

在本文中将介绍如何在Debian 12 上使用 snap 安装 Let's Encrypt Certbot 获取免费 TLS / SSL 证书,为使用 Apache 服务器的网站启用 Https 协议。

如果你实用其他操作系统请查看:安装Let's Encrypt Certbot免费SSL证书为网站启用https

安装 Certbot

使用 Snap 软件包安装 Let's Encrypt Certbot,不需要单独安装 Apache 插件,安装完 Let's Encrypt Certbot 就已经安装了 Apache 插件。

1、更新 Debian 12 软件源

$ sudo apt update

2、安装 snapd

$ sudo apt install snapd

键入 YEnter 完成 snapd 的安装

3、使用 snap 命令安装 core snap软件包,它是安装普通 snap 包的依赖:

$ sudo snap install core

4、刷新 core snap软件包,目的为确保 snapd 及其依赖为最新版本:

$ sudo snap refresh core

5、使用 snap 命令安装 Certbot

sudo snap install --classic certbot

snap命令参数解释:

  • --strict:禁止 snap 应用访问系统资源与网络
  • --classic:允许 snap 应用访问系统资源与网络

注意:安装 certbot 时需要使用--classic参数,因为certbot需要访问系统资源及网络

6、添加 Certbot 到 PATH

添加 Certbot 到 PATH 能够方便的在终端中使用该命令:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

启用Apache模块

Debian 12 系统上为 Apache 服务网站启用 Https,需要先启用 Apache 的一些模块。Apache 的模块配置启用模块的文件文件夹为 /etc/apache2/mods-enabled,Apache在其配置文件 /etc/apache2/apache2.conf内导入了该文件内的所有模块。

Debian 系统下的 Apache 提供了启用模块的命令a2enmod和禁用模块的命令a2dismod,操作简单方便。

启用 Apache SSL / TLS 模块

默认情况下 Apache SSL / TLS 模块没有启用,使用 a2enmod 命令启用 Apache SSL / TLS 模块:

$ sudo a2enmod ssl

启用 Apache Rewrite 模块

默认情况下 Apache Rewrite 模块没有启用,使用 a2enmod 命令启用 Apache Rewrite 模块:

$ sudo a2enmod rewrite

配置Apache虚拟机

为网站下载 Let's Encrypt Certbot Https (SSL)证书需要访问 Apache 的虚拟机信息,因此需先配置好 Apache 的虚拟机。

以下 Apache 虚拟机配置以域名 example.com 为例,在你的项目中,需要修改成你自己的域名

简单HTML站点的虚拟机配置

创建一个简单的 HTML 项目,以 HTTPS 协议访问站点时显示该 HTML 文件内容,该 HTML 文件只是用来测试使用 Let's Encrypt Certbot 获取的免费 SSL 证书是否配置正确,能够为网站启用 HTTPS。

1、创建项目目录

sudo mkdir /var/www/example

2、创建HTML文件

sudo vi /var/www/example/index.html

添加代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>启用 HTTPS</title>
</head>
<body>
    <p>成功启用Https</p>
</body>
</html>

3、创建本站点80端口虚拟机

sudo vi /etc/apache2/sites-available/example.conf

添加如下代码,启用 301 跳转:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent "/" "https://www.example.com/"
</VirtualHost>

4、创建本站点443端口虚拟机

Let's Encrypt Certbot 添加虚拟机SSL证书时使用的 443 端口对应虚拟机的名称是 "80端口虚拟机的名称 + le-ssl",本例中80端口对应虚拟机的名称是example,因此443端口对应的虚拟机的文件名称为example-le-ssl.conf

sudo vi /etc/apache2/sites-available/example-le-ssl.conf

添加如下代码:

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/example
    <Directory /var/www/example>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        RewriteEngine on
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !=/favicon.ico
        RewriteRule ^ index.html [L]
    </Directory>
</VirtualHost>
<VirtualHost *:443>
    ServerName example.com
    Redirect permanent "/" "https://www.example.com/"
</VirtualHost>

5、启用Apache站点虚拟机

Debian 12 系统下的 Apache 提供了启用站点虚拟机的命令 a2ensite 和禁用虚拟机的命令 a2dissite,操作简单方便。

使用a2ensite命令启用exampleexample-le-ssl站点:

$sudo a2ensite example
$sudo a2ensite example-le-ssl

PHP语言虚拟机配置

其他的配置与简单HTML站点的配置相同,只有 www.exmaple.com 对应443端口的虚拟机不同,在此我们只给出该虚拟机的配置:

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/example
    <Directory /var/www/example>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        RewriteEngine on
        RewriteBase /
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !=/favicon.ico
        RewriteRule ^ index.php [L]
    </Directory>
</VirtualHost>

配置解释:把非文件及非目录的访问,重定向到 index.php,由 PHP 相应并生成 HTML。

Python语言虚拟机配置

其他的配置与简单HTML站点的配置相同,只有 www.exmaple.com 对应443端口的虚拟机不同,在此我们只给出该虚拟机的配置。

虚拟机配置以 Django 或 Wagtail CMS 的虚拟机配置为例:

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/example
    Alias /favicon.ico /var/www/example/static/favicon.ico
    Alias /robots.txt /var/www/example/static/robots.txt
    Alias /static/ /var/www/example/static/
    Alias /media/ /var/www/example/media/
    <Directory /var/www/example/static>
        Require all granted
    </Directory>
    <Directory /var/www/example/media>
        Require all granted
    </Directory>
    WSGIDaemonProcess wsgi_example_ssl python-home=/var/www/venv/example python-path=/var/www/example
    WSGIProcessGroup wsgi_example_ssl
    WSGIScriptAlias / /var/www/example/example/wsgi.py process-group=wsgi_example_ssl
    <Directory /var/www/example/example>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>

启用SSL模块后自动启用Apache 443端口

Debian 12 系统下端口的配置文件为/etc/apache2/ports.conf,根据文件配置,当启用了SSL模块后,就自动启用了 443 端口,无需额外的配置。

为网站获取 Let’s Encrypt 证书

为网站获取 Let’s Encrypt Certbot 的 Https 证书的方式有两种:

  • 获取证书并自动配置 Apache 的虚拟机,为站点添加使用证书信息
  • 只获取证书不配置 Aapche 虚拟机

获取证书并配置 Apache

1、只为 www.example.com 获取证书

sudo certbot --apache -d www.example.com

2、为 example.comwww.example.com 站点获取证书

sudo certbot --apache -d example.com -d www.example.com

输出信息如下:

Output
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example/privkey.pem
This certificate expires on 2024-3-11.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for example.com to /etc/apache2/sites-available/example-le-ssl.conf
Successfully deployed certificate for www.example.com to /etc/apache2/sites-available/example-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

只获取证书

sudo certbot certonly --apache -d www.example.com

自动更新SSL证书

1、如果要测试 Certbot 获取免费 SSL 证书的过程,可以运行如下 certbot 命令:

$ sudo certbot renew --dry-run

2、Debian 12 系统下安装Let's Encrypt Certbot后,Let's Encrypt Certbot SSL 证书 90 天后就会过期,创建 cron 脚本每 12 小时更新一次 Certbot SSL 证书,运行如下代码:

sudo echo "0 0,12 * * * root /usr/bin/python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

结语

在本文中,讲述了如何在 Debian 12 系统下使用 Snap 软件包安装 Let’s Encrypt 的客户端 certbot,为站点获取免费 SSL 证书,并为 Apache 站点配置使用该证书,最后介绍了如何创建 cron 脚本,自动更新 Let's Encrypt 免费 SSL 证书。在 Debian 12 中安装 Certbot后,很多步骤就已经自动完成。