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

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

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

安装Certbot及Aapche插件

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

安装EPEL仓库

1、Certbot 及其 Apache 插件的软件包在 epel 仓库内,需要先安装 epel:

sudo dnf install epel-release

2、更新系统:

sudo dnf upgrade

安装系统依赖包

配置 Apache 启用 htttps 需要使用的 SSL 软件包:

sudo dnf install mod_ssl

安装Certbot

1、查找软件包 certbot 软件对应的 AlmaLinux 9 系统包信息:

sudo dnf search certbot

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

certbot.noarch : A free, automated certificate authority client
python3-certbot.noarch : Python 3 libraries used by certbot
python3-certbot-apache.noarch : The apache plugin for certbot

2、使用 AlmaLinux 9 系统包安装 certbot 及 Apache 的插件:

sudo dnf install certbot python3-certbot python3-certbot-apache

测试Certbot是否安装正确

sudo certbot

启用Apache模块

AlmaLinux 9 系统上为 Apache 服务网站启用 Https,需要先启用 Apache 的一些模块和配置 Apache 虚拟机。AlmaLinux 9 系统中已经安装的Apache 模块存放在文件夹/etc/httpd/modules,Apache 配置启用模块的文件文件夹为 /etc/httpd/conf.modules.d

启用 Apache SSL / TLS 模块

AlmaLinux 9 默认情况下是没有安装SSL模块的,我们已经在安装系统依赖包时安装了SSL模块。安装SSL模块后会自动创建/etc/httpd/conf.modules.d/00-ssl.conf,用来加载并启动SSL模块。

如果提示未启用SSL模块,请重启 Apache 服务器:

sudo sytemctl restart httpd

Apache Rewrite模块默认已启用

默认情况下 AlmaLnux 9 中安装 Httpd 后,默认已经启用了 Rewrite 模块。

配置Apache虚拟机

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

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

创建存放虚拟机的目录

1、为了方便管理虚拟机,我们创建两个存放虚拟机的目录用来管理虚拟机:

sudo mkdir /etc/httpd/conf.sites-available.d
sudo mkdir /etc/httpd/conf.sites-enabled.d

解释说明:

  • conf.sites-available.d:用来存放可用的虚拟机文件。
  • conf.sites-enabled.d:用来存放启用的虚拟机文件,它是到可用虚拟机的符号链接。

2、编辑/etc/httpd/conf/httpd.conf文件,导入/etc/httpd/conf.sites-enabled.d文件夹内的配置文件,启用该文件夹内的虚拟机:

sudo vi /etc/httpd/conf/httpd.conf

在文件的末尾添加:

IncludeOptional conf.sites-enabled.d/*.conf

简单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/httpd/conf.sites-available.d/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/httpd/conf.sites-available.d/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站点虚拟机

创建从/etc/httpd/conf.sites-available.d/文件夹内的文件到/etc/httpd/conf.sites-enabled.d/文件夹内的符号链接启用exampleexample-le-ssl站点:

sudo ln -s /etc/httpd/conf.sites-available.d/example.conf /etc/httpd/conf.sites-enabled.d/
sudo ln -s /etc/httpd/conf.sites-available.d/example-le-ssl.conf /etc/httpd/conf.sites-enabled.d/

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

AlmaLinux 9 系统下启用 443 端口的配置文件为/etc/httpd/conf.d/ssl.conf,该文件是在安装mod_ssl软件后自动创建的。

为网站获取 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/httpd/conf.sites-available.d/example-le-ssl.conf
Successfully deployed certificate for www.example.com to /etc/httpd/conf.sites-available.d/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、AlmaLinux 9 系统下安装Let's Encrypt Certbot后,Let's Encrypt Certbot SSL 证书 90 天后就会过期,创建 cron 脚本每 12 小时更新一次 Certbot SSL 证书,运行如下代码:

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

结语

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