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

本文介绍在 FreeBSD 13 系统上使用 FreeBSD 13 的系统安装包安装 配置 Let's Encrypt Certbot,为使用 Apache 服务器的网站开启 Https 加密服务。

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

安装 Certbot 及 Aapche 插件

使用 Python 的软件包安装 Let's Encrypt Certbot,可以安装最新版的 Let's Encrypt Certbot,同时可以使用新版的 Python。

安装新版本Python

在 FreeBSD 13 系统中默认安装 Python 版本为 3.9。如果想要使用新版本的Python,需要单独安装,在本文中我们安装Python 3.11:

sudo pkg install python311

安装系统依赖包

编译安装 Let's Encrypt Certbot 所需的系统依赖包

sudo pkg install augeas rust

创建 Python 激活虚拟环境

把 Let's Encrypt Certbot 的 pip 软件包安装在 Python 的虚拟环境下,以方便管理、升级 Certbot 及解决运行中出现的问题。

sudo mkdir -p /usr/local/www/certbot
sudo chown usergroup:username /usr/local/www/certbot
sudo chmod -R go=u /usr/local/www/certbot
sudo python3.11 -m venv /usr/local/www/certbot

安装 Certbot 的 Python 软件包

要以 root 权限运行命令,这样才能方便访问 Certbot

sudo /usr/local/www/certbot/bin/pip install certbot certbot-apache

如果下载 Python 软件包速度很慢,使用如下命令快速下载 Python 软件包:

sudo /usr/local/www/certbot/bin/pip install -i https://mirrors.tencent.com/pypi/simple certbot certbot-apache

加入 Certbot 到 PATH

sudo ln -s /usr/local/www/certbot/bin/certbot /usr/local/bin/certbot

升级Certbot

sudo /usr/local/www/certbot/bin/pip install --upgrade certbot certbot-apache

删除Certbot

在 FreeBSD 13 中使用 Let's Encrypt Certbot 的过程中,如果出现了问题而无法解决,可以删除了 Certbot 再重新安装。

使用Python软件包安装的Certbot,只需删除创建的符号链接及Certbot的虚拟环境即可:

sudo rm /usr/local/bin/certbot
sudo rm -rf /usr/local/www/certbot/*

启用 Apache 模块

FreeBSD 13 系统上为 Apache 服务网站启用 Https,需要先启用 Apache 的一些模块和配置 Apache 虚拟机。Apache 的配置在配置文件 /usr/local/etc/apache24/httpd.conf 内。

启用 Apache SSL / TLS 模块

Apache SSL / TLS 功能所对应的模块为 mod_ssl.so

查找 mod_ssl.so 所在行号:

grep -n 'mod_ssl.so' /usr/local/etc/apache24/httpd.conf

注: -n 参数是获取行号

显示:

149:#LoadModule ssl_module libexec/apache24/mod_ssl.so

编辑httpd.conf并定位到 mod_ssl.so 所在行,启用模块

sudo vi +149 /usr/local/etc/apache24/httpd.conf

键入 x 删除改行的注释, 启用SSL模块;键入:wq 然后键入 ENTER , 保存并推出文件

启用 Apache Rewrite 模块

Apache Rewrite 功能所对应的模块为 mod_rewrite.so

查找 mod_rewrite.so 所在行号:

grep -n 'mod_rewrite.so' /usr/local/etc/apache24/httpd.conf

注: -n 参数是获取行号

显示:

182:#LoadModule ssl_module libexec/apache24/mod_rewrite.so

编辑httpd.conf并定位到 mod_rewrite.so 所在行,启用模块

sudo vi +182 /usr/local/etc/apache24/httpd.conf

键入 x 删除改行的注释, 启用SSL模块;键入:wq 然后键入 ENTER , 保存并推出文件

配置Apache虚拟机

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

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

创建存放虚拟机的目录

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

sudo mkdir /usr/local/etc/apache24/sites-available.d
sudo mkdir /usr/local/etc/apache24/sites-enabled.d

解释说明:

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

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

sudo vi /usr/local/etc/apache24/extra/httpd-vhosts.conf

在文件的末尾添加:

Include etc/apache24/sites-enabled.d/*.conf

简单HTML站点的虚拟机配置

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

1、创建项目目录

sudo mkdir /usr/local/www/example

2、创建HTML文件

sudo vi /usr/local/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 /usr/local/etc/apache24/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 /usr/local/etc/apache24/sites-available.d/example-le-ssl.conf

添加如下代码:

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /usr/local/www/example
    <Directory /usr/local/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站点虚拟机

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

sudo ln -s /usr/local/etc/apache24/sites-available.d/example.conf /usr/local/etc/apache24/sites-enabled.d/
sudo ln -s /usr/local/etc/apache24/sites-available.d/example-le-ssl.conf /usr/local/etc/apache24/sites-enabled.d/

PHP语言虚拟机配置

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

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

启用 Apache 虚拟机配置

Apache 虚拟机对应的文件为 httpd-vhosts.conf

查找 httpd-vhosts.conf 所在行号:

grep -n 'httpd-vhosts.conf' /usr/local/etc/apache24/httpd.conf

注: -n 参数是获取行号

显示:

510:#Include etc/apache24/extra/httpd-vhosts.conf

编辑 httpd.conf 并定位到 httpd-vhosts.conf 所在行,启用虚拟机

sudo vi +510 /usr/local/etc/apache24/httpd.conf

键入 x 删除改行的注释, 启用SSL模块;键入:wq 然后键入 ENTER , 保存并推出文件

启用 Apache 443 端口

Apache 配置文件中端口对应的配置为 Listen

查找 Listen 所在行号:

grep -n 'Listen' /usr/local/etc/apache24/httpd.conf

注: -n 参数是获取行号

显示:

44:# Listen: Allows you to bind Apache to specific IP addresses and/or
48:# Change this to Listen on specific IP addresses as shown below to 
51:#Listen 12.34.56.78:80
52:Listen 80

编辑 httpd.conf 并定位到 Listen 显示信息的最后一行,新起一行添加端口

sudo vi +52 /usr/local/etc/apache24/httpd.conf

光标转到行尾,键入 a 编辑文件,键入 ENTER 新起一行,输入 Listen 443,输入 ESC,键入:wq 然后键入 ENTER , 保存并推出文件

为网站获取 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

只获取证书

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

配置 certbot 证书自动更新

使用 certbot 命令查看获取证书的过程

sudo certbot renew --dry-run

使用 cron 自动获取证书

运行 crontab 命令编辑 cron 的脚本

sudo crontab -e

添加如下代码:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
# Order of crontab fields
# minute    hour    mday    month   wday    command
  0         0,12    *       *       *       /usr/local/bin/certbot renew

结语

在本文中,讲述了如何在 FreeBSD 13 系统下使用 Python 软件包安装 Let’s Encrypt 的客户端 certbot,并为站点下载 SSL 证书,并为 Apache 站点配置使用该证书,最后配置了 Certbot 证书自动更新。