在浏览器地址栏输入网址时,你是否注意过那个小小的锁图标🔒?它不仅是网站安全的象征,更关乎用户数据的隐私保护。这个锁背后,正是HTTPS证书在默默工作。今天我们就来系统聊聊HTTPS证书的那些事,从原理到实战,教你用acme.sh轻松搞定证书申请与自动续订。
一、HTTPS证书是什么?有哪些级别?
1. 什么是HTTPS证书?
HTTPS证书(SSL/TLS证书)是一种数字证书,由权威机构(CA,Certificate Authority)颁发,用于验证网站的身份并加密浏览器与服务器之间的通信。它的核心作用有两个:
加密传输:防止数据在传输过程中被窃取或篡改
身份验证:证明网站的真实身份,避免用户访问钓鱼网站
2. 证书的级别区分
根据验证严格程度和适用场景,HTTPS证书主要分为3类:
证书类型 | 全称 | 验证方式 | 适用场景 | 价格 | 显示效果 |
|---|---|---|---|---|---|
DV证书 | 域名验证型(Domain Validated) | 仅验证域名所有权(通过邮箱/文件/DNS验证) | 个人网站、博客、小型站点 | 免费(如Let's Encrypt)或低价 | 地址栏显示小锁图标🔒 |
OV证书 | 组织验证型(Organization Validated) | 验证域名所有权+企业/组织真实身份(需提供营业执照等) | 企业官网、电商平台 | 每年数百至数千元 | 显示小锁+组织名称 |
EV证书 | 扩展验证型(Extended Validation) | 最严格的验证,包含OV所有内容+深度审核企业资质 | 金融机构、支付平台、大型企业 | 每年数千元至万元 | 地址栏显示绿色背景+组织名称 |
总结:DV证书满足基础安全需求,适合个人和小型网站;OV/EV证书更侧重身份可信度,适合对安全等级要求高的商业场景。
二、HTTPS证书申请全攻略
无论选择哪种证书,申请流程都大同小异,核心是向CA证明你对域名的所有权。
1. 申请前的准备
已注册并解析的域名(如
example.com)服务器环境(需开放80/443端口,验证和服务需要)
域名所有权证明(根据验证方式准备,如服务器文件、DNS解析权限等)
2. 常见申请渠道
免费渠道:Let's Encrypt(DV证书,90天有效期)、ZeroSSL(DV证书,支持免费申请)
付费渠道:阿里云、腾讯云等云服务商(提供OV/EV证书,含技术支持)、GlobalSign、DigiCert等国际CA机构
3. 验证域名所有权的3种方式
CA颁发证书前,必须确认你是域名的合法持有者,常见验证方式有:
文件验证:在网站根目录下放置CA提供的验证文件
DNS验证:在域名解析中添加指定的TXT记录
邮箱验证:通过域名管理员邮箱(如admin@example.com)接收验证邮件
其中,文件验证和DNS验证最常用,适合自动化流程。
三、用acme.sh生成HTTPS证书:简单高效的开源方案
acme.sh是一款开源的证书管理工具,支持自动申请、续期Let's Encrypt、ZeroSSL等CA的证书,全程无需人工干预,特别适合开发者和服务器管理员。
1. 安装acme.sh
登录服务器,执行以下命令安装(以Linux为例):
# 安装acme.sh,自动添加到环境变量
curl https://get.acme.sh | sh -s email=your@email.com
# 重新加载环境变量
source ~/.bashrc安装完成后,输入acme.sh --version验证是否成功,如果在国内,速度比较慢可以直接通过:
git clone https://gitee.com/neilpang/acme.sh.gitclone完成后,会在运行程序目录下看到 acme.sh目录,进入执行:
cd acme.sh
[root@iZwz934tvtp7qtuogp9o2fZ acme.sh]# ./acme.sh --install -m example@qq.com
[Sat Jul 26 12:07:06 CST 2025] It is recommended to install socat first.
[Sat Jul 26 12:07:06 CST 2025] We use socat for standalone server if you use standalone mode.
[Sat Jul 26 12:07:06 CST 2025] If you don't use standalone mode, just ignore this warning.
[Sat Jul 26 12:07:06 CST 2025] Installing to /root/.acme.sh
[Sat Jul 26 12:07:06 CST 2025] Installed to /root/.acme.sh/acme.sh
[Sat Jul 26 12:07:06 CST 2025] Installing alias to '/root/.bashrc'
[Sat Jul 26 12:07:06 CST 2025] OK, Close and reopen your terminal to start using acme.sh
[Sat Jul 26 12:07:06 CST 2025] Installing alias to '/root/.cshrc'
[Sat Jul 26 12:07:06 CST 2025] Installing alias to '/root/.tcshrc'
[Sat Jul 26 12:07:06 CST 2025] Installing cron job
[Sat Jul 26 12:07:06 CST 2025] Good, bash is found, so change the shebang to use bash as preferred.
[Sat Jul 26 12:07:07 CST 2025] OK通过上面的执行日志可以看到,acme.sh被安装到/root/.acme.sh这个隐藏目录下,并且会配置
2. 生成证书(以Webroot验证为例)
假设你的网站使用Nginx,根目录为/var/www/html/nginx-web,要为example.com和www.example.com生成证书:
# 生成证书并指定证书保存路径
acme.sh --issue \
-d example.com \
-d www.example.com \
--webroot /var/www/html/nginx-web \
--key-file /usr/local/nginx/conf/ssl/example.key \
--fullchain-file /usr/local/nginx/conf/ssl/example.crt \
--server https://acme.zerossl.com/v2/DV90参数说明:
-d:指定域名(可多次使用添加多个域名)--webroot:网站根目录,用于文件验证--key-file:私钥保存路径--fullchain-file:证书链保存路径--server:指定CA(这里用ZeroSSL,也可省略默认用Let's Encrypt)
nginx的典型HTTPS的配置如下:
server {
listen 443 ssl;
# 这里改动了,也可以写你的域名
server_name www.example.com;
server_tokens off;
ssl_certificate /usr/local/nginx/conf/ssl/example.crt; #全链证书文件
ssl_certificate_key /usr/local/nginx/conf/ssl/example.key; #私钥 key 文件
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA;
# 默认网站根目录(www目录)
root /var/www/html/nginx-web;
...
}注意:证书我们一定要用fullchain-file这个全链证书;
3. 验证证书是否生成成功
# 查看证书文件
ls -l /usr/local/nginx/conf/ssl/
# 检查证书信息
openssl x509 -in /usr/local/nginx/conf/ssl/example.crt -noout -text如果输出证书有效期、域名等信息,说明生成成功!
四、自动续订证书+重启Nginx:一键搞定运维难题
免费证书通常有效期为90天,手动续期太麻烦?用acme.sh+脚本实现全自动化!
1. 自动续订原理
acme.sh安装时会自动添加cron任务,每天检查证书是否需要续期(默认到期前30天自动更新)。但证书更新后,需要重启Nginx才能生效,因此需要额外脚本配合。
2. 自动续订+重启Nginx脚本
创建/root/cert_renew.sh脚本,内容如下:
#!/bin/bash
# 证书自动续订并重启Nginx脚本
# 配置参数
ACME_SH="/root/.acme.sh/acme.sh"
NGINX_BIN="/usr/local/nginx/sbin/nginx"
CERT_DIR="/usr/local/nginx/conf/ssl"
DOMAIN="example.com"
LOG_FILE="/var/log/acme_renew.log"
# 记录当前证书修改时间
OLD_MOD_TIME=$(stat -c %Y ${CERT_DIR}/example.crt 2>/dev/null || echo 0)
# 执行证书续订
echo "[$(date)] 开始续订证书..." >> $LOG_FILE
$ACME_SH --renew \
-d $DOMAIN \
-d www.$DOMAIN \
--webroot /var/www/html/nginx-web \
--key-file ${CERT_DIR}/example.key \
--fullchain-file ${CERT_DIR}/example.crt >> $LOG_FILE 2>&1
# 检查证书是否更新
NEW_MOD_TIME=$(stat -c %Y ${CERT_DIR}/example.crt 2>/dev/null || echo 0)
if [ $NEW_MOD_TIME -gt $OLD_MOD_TIME ]; then
echo "[$(date)] 证书已更新,重启Nginx..." >> $LOG_FILE
$NGINX_BIN -t >> $LOG_FILE 2>&1 # 检查Nginx配置
$NGINX_BIN -s reload >> $LOG_FILE 2>&1 # 重启Nginx
echo "[$(date)] Nginx重启成功" >> $LOG_FILE
else
echo "[$(date)] 证书未更新,无需操作" >> $LOG_FILE
fi注意:运行脚本申请证书或续订证书的时候,要把网站打开,在网站所在的主机运行如果不在网站的主机运行,可以通过DNS服务器上配置txt内容来做校验:
[root@iZwz934tvtp7qtuogp9o2fZ .acme.sh]# ./acme.sh --issue --dns -d *.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
[Sat Jul 26 12:22:26 CST 2025] Using CA: https://acme.zerossl.com/v2/DV90
[Sat Jul 26 12:22:26 CST 2025] Create account key ok.
[Sat Jul 26 12:22:26 CST 2025] No EAB credentials found for ZeroSSL, let's get one
[Sat Jul 26 12:22:28 CST 2025] Registering account: https://acme.zerossl.com/v2/DV90
[Sat Jul 26 12:23:22 CST 2025] Registered
[Sat Jul 26 12:23:22 CST 2025] ACCOUNT_THUMBPRINT='4zHd5w5uuWReGACWZw7R6x3zuRropy3PYApJyJ72oFo'
[Sat Jul 26 12:23:22 CST 2025] Creating domain key
[Sat Jul 26 12:23:23 CST 2025] The domain key is here: /root/.acme.sh/*.example.com/*.example.com.key
[Sat Jul 26 12:23:23 CST 2025] Single domain='*.example.com'
[Sat Jul 26 12:23:23 CST 2025] Getting domain auth token for each domain
[Sat Jul 26 12:24:49 CST 2025] Getting webroot for domain='*.example.com'
[Sat Jul 26 12:24:49 CST 2025] Add the following TXT record:
[Sat Jul 26 12:24:49 CST 2025] Domain: '_acme-challenge.example.com'
[Sat Jul 26 12:24:49 CST 2025] TXT value: 'FscPCgbQRWxzSk8bi8rt0je2UKk8H93-o6NV6xtJumw'在域名解析地方配置主机记录名为:_acme-challenge.example.com,类型为TXT 值为:FscPCgbQRWxzSk8bi8rt0je2UKk8H93-o6NV6xtJumw的一条记录,用于做验证; 阿里云上配置如下图:
3. 配置权限与定时任务
# 赋予脚本执行权限
chmod +x /root/cert_renew.sh
# 添加到crontab(每天凌晨3点执行)
crontab -e
# 加入以下内容
0 3 * * * /root/cert_renew.sh4. 验证自动续订是否生效
# 手动测试脚本
/root/cert_renew.sh
# 查看日志
tail -f /var/log/acme_renew.log如果日志显示“证书已更新,重启Nginx...”,说明脚本正常工作!
总结
HTTPS早已不是可选配置,而是网站的基本要求。从了解证书级别到用acme.sh实现全自动化管理,本文涵盖了从原理到实战的完整流程。按照步骤操作,即使是非专业运维人员也能轻松搞定HTTPS证书。
如果觉得有用,欢迎点赞收藏,转发给需要的朋友~ 如有疑问,欢迎在留言区交流!
6245

被折叠的 条评论
为什么被折叠?



