环境准备:Linux基础操作回顾、Docker与Docker Compose安装、ACME客户端安装

说实话,做边缘网关证书续签这件事,环境准备是最容易被忽略的一环。我见过太多人一上来就急着跑命令,结果卡在权限、网络、依赖这些基础问题上,折腾半天才发现是环境没搭好。这一章,咱们就把地基打牢。

2.1 Linux基础操作回顾

你可能会想:「Linux基础还要讲?」嗯,我理解。但边缘网关的环境往往比服务器更苛刻——资源有限、网络不稳定、甚至没有图形界面。有些操作你平时觉得简单,到了现场就抓瞎。

2.1.1 文件系统与权限

证书文件最怕什么?权限不对。我曾经在客户现场排查了整整两个小时,最后发现是证书文件权限设成了 777,ACME 客户端死活不认。

核心原则:证书私钥必须只有 root 或证书管理用户可读,建议 600 或 400。

# 查看文件权限
ls -la /etc/ssl/certs/

# 修改权限
chmod 600 /etc/ssl/private/domain.key

# 修改所有者
chown root:root /etc/ssl/private/domain.key

2.1.2 网络与防火墙

ACME 协议需要从 Let's Encrypt 服务器拉取证书,同时要验证域名所有权。说白了,你的网关必须能访问外网,而且 80 或 443 端口要开放。

端口 方向 用途
80/tcp 入站 HTTP-01 验证(Let's Encrypt 回访)
443/tcp 入站 TLS-ALPN-01 验证
53/udp 出站 DNS-01 验证(DNS API 方式)

我的经验:如果网关在内网,建议提前用 curl -I https://acme-v02.api.letsencrypt.org 测试连通性。别等到部署时才发现网络不通。

2.1.3 定时任务基础

证书自动续签的核心就是 cron。你想想看,证书有效期只有 90 天,手动续?不现实。

# 编辑定时任务
crontab -e

# 每天凌晨 3 点检查证书
0 3 * * * /usr/bin/certbot renew --quiet

注意:边缘网关的时间可能不准。如果系统时间偏差超过 5 分钟,ACME 验证会失败。建议先配好 NTP。

2.2 Docker 与 Docker Compose 安装

为什么用 Docker?说白了,隔离性好、环境一致、部署简单。我在多个边缘项目里都用 Docker 跑 ACME 客户端,从来没出过环境冲突的问题。

2.2.1 安装 Docker

不同发行版安装方式略有差异,但核心步骤差不多。我以 Ubuntu/Debian 为例:

# 更新包索引
sudo apt update

# 安装依赖
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 启动并设置开机自启
sudo systemctl enable docker
sudo systemctl start docker

# 验证安装
sudo docker --version

避坑指南:我曾经在树莓派上装 Docker,忘了加 --arch 参数,结果拉下来的镜像全是 x86 的,跑都跑不起来。ARM 设备一定要确认架构。

2.2.2 安装 Docker Compose

Docker Compose 用来编排多容器。虽然 ACME 客户端通常单容器就够了,但后续你可能需要配合 Nginx、Certbot 一起跑,Compose 就派上用场了。

# 下载最新版 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

注意:如果下载速度慢,可以用国内镜像源。我一般用 https://get.daocloud.io/docker/compose/releases/download/ 替换官方地址。

2.3 ACME 客户端安装

ACME 客户端是证书续签的主角。市面上主流的有两个:acme.sh 和 Certbot。我个人更倾向 acme.sh,原因后面说。

2.3.1 安装 acme.sh

acme.sh 是纯 Shell 脚本,轻量、无依赖,特别适合边缘网关这种资源受限的环境。

# 一键安装
curl https://get.acme.sh | sh

# 或者用 wget
wget -O -  https://get.acme.sh | sh

# 重新加载 shell 配置
source ~/.bashrc

# 验证安装
acme.sh --version

安装完成后,acme.sh 会自动创建定时任务,每天检查证书是否需要续签。这一点非常省心。

acme.sh 的优势:

  • 纯 Shell 实现,无 Python/Node 依赖
  • 支持 100+ DNS API(阿里云、腾讯云、AWS Route53 等)
  • 自动续签,无需额外配置
  • 支持 ECC 证书(更小、更快)

2.3.2 安装 Certbot

Certbot 是 Let's Encrypt 官方推荐的客户端,功能强大,但依赖 Python 环境。如果你的网关资源充裕,可以考虑。

# Ubuntu/Debian
sudo apt update
sudo apt install -y certbot

# 验证安装
certbot --version

# 或者用 snap(推荐)
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

我的建议:如果网关是 x86 架构、内存大于 512MB,用 Certbot 没问题。如果是 ARM 或内存紧张,acme.sh 更合适。

2.3.3 两种客户端对比

特性 acme.sh Certbot
语言 Shell Python
依赖 无 Python 3 + 若干包
安装体积 ~500KB ~50MB
DNS API 支持 100+ 有限(需插件)
自动续签 内置 cron 需 systemd timer 或 cron
ECC 证书 原生支持 需额外参数

2.4 本章知识体系

下面这张图帮你理清环境准备的脉络:

环境准备核心结构 Linux 基础操作 Docker + Compose ACME 客户端 文件权限 网络与防火墙 定时任务 cron Docker Engine Docker Compose acme.sh Certbot 核心思路 先打好 Linux 基础 → 再用 Docker 隔离环境 → 最后选一个 ACME 客户端 这三步走完,证书自动续签的底座就稳了。

2.5 验证环境

装完别急着走,先验证一下环境是否正常。我习惯写一个简单的检查脚本:

#!/bin/bash
# 环境检查脚本

echo "=== 系统信息 ==="
uname -a

echo "=== Docker 版本 ==="
docker --version

echo "=== Docker Compose 版本 ==="
docker-compose --version

echo "=== ACME 客户端 ==="
if command -v acme.sh &> /dev/null; then
    acme.sh --version
elif command -v certbot &> /dev/null; then
    certbot --version
else
    echo "未安装 ACME 客户端"
fi

echo "=== 网络连通性 ==="
curl -I https://acme-v02.api.letsencrypt.org --connect-timeout 5

我的习惯:把这个脚本保存为 check-env.sh,每次部署新网关都跑一遍。省得漏掉什么。