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

在本文中将介绍如何在 Ubuntu 2204 上使用系统包安装 Let's Encrypt Certbot 获取免费 TLS / SSL 证书,为使用 Apache 服务器的网站启用 Https 协议,并设置证书自动更新。

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

安装 Certbot 及 Aapche 插件

使用 Ubuntu 2204 系统包安装 Let's Encrypt Certbot 安装的软件的版本不是最新的。

1、更新 Ubuntu 2204 软件源

sudo apt update

2、查找软件包 certbot 软件对应的 Ubuntu 2204 系统包信息:

sudo apt search certbot

显示信息很多,其中包括如下信息:

certbot/jammy 1.21.0-1build1 all
  使用 Let's Encrypt 自动配置 HTTPS

python3-certbot/jammy 1.21.0-1build1 all
  main library for certbot

python3-certbot-apache/jammy 1.21.0-1build1 all
  Apache plugin for Certbot

3、使用 Ubuntu 2204 系统包安装 certbot 及 Apache 的插件:

sudo apt install certbot python3-certbot python3-certbot-apache

启用Apache模块

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

Ubuntu 2204 系统下的 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站点虚拟机

Ubuntu 2204 系统下的 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端口

Ubuntu 2204 系统下端口的配置文件为 /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证书

Ubuntu 2204 系统下安装Let's Encrypt Certbot后,Let's Encrypt Certbot 就自动创建了 cron 脚本/etc/cron.d/certbot,该脚本会每 12 小时更新一次 Certbot SSL 证书。

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

$ sudo certbot renew --dry-run

结语

在本文中,讲述了如何在 Ubuntu 2204 系统下使用系统包安装 Let’s Encrypt 的客户端 certbot,并为站点获取免费 SSL 证书,并为 Apache 站点配置使用该证书。在 Ubuntu 2204 中安装 Certbot后,很多步骤就已经自动完成。