一文搞定HTTPS证书的免费申请和续订

在浏览器地址栏输入网址时,你是否注意过那个小小的锁图标🔒?它不仅是网站安全的象征,更关乎用户数据的隐私保护。这个锁背后,正是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.git

clone完成后,会在运行程序目录下看到 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.comwww.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的一条记录,用于做验证; 阿里云上配置如下图:image.png

3. 配置权限与定时任务

# 赋予脚本执行权限
chmod +x /root/cert_renew.sh

# 添加到crontab(每天凌晨3点执行)
crontab -e
# 加入以下内容
0 3 * * * /root/cert_renew.sh

4. 验证自动续订是否生效

# 手动测试脚本
/root/cert_renew.sh

# 查看日志
tail -f /var/log/acme_renew.log

如果日志显示“证书已更新,重启Nginx...”,说明脚本正常工作!

总结

HTTPS早已不是可选配置,而是网站的基本要求。从了解证书级别到用acme.sh实现全自动化管理,本文涵盖了从原理到实战的完整流程。按照步骤操作,即使是非专业运维人员也能轻松搞定HTTPS证书。

如果觉得有用,欢迎点赞收藏,转发给需要的朋友~ 如有疑问,欢迎在留言区交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值