手动申请域名ssl证书acme.sh脚本申请cloudflare的证书 支持泛域名

acme.sh脚本申请cloudflare的证书 支持泛域名

前言:acme.sh是一个非常好用的用于申请证书的脚本,它开源在Github,它极大地降低了申请证书的难度,支持使用cloudflare api等多种api来申请证书。

本文主要介绍使用此脚本来申请 ssl 证书,给你的http请求加把锁,具体可以用来cloudflare api介绍。

准备条件:

一台被分配了公网IP的主机

一个域名(建议购买收费域名)

电脑ssh客户端

能解决个体的问题

一、全球API申请证书

1.1、安装脚本文件 以root用户ssh连接到主机,使用下面的命令安装脚本:

apt update && apt -y install socat //更新源并安装socat

wget -qO- get.acme.sh | bash //安装此脚本

source ~/.bashrc //让别名生效,此后无论在哪里直接使用acme.sh,不用输绝对路径

# 由于最新acme.sh脚本默认ca变成了zerossl,现## 执行下面命令修改脚本默认ca为letsencrypt
acme.sh --set-default-ca --server letsencrypt

1.2、证书配置 1.2.1 获取Cloudflare api key 注册好cloudflare账号,把域名解析的解析权限锁定cloudflare处理,这样以后只需要在cloudflare这里配置解析记录。按照图标获取cloudflare api key。

CleanShot 2025-05-12 at 08.24.26@2x

1.2.2 申请证书(二选一) 这里假设您的域名是yourdomain.com,执行下面命令申请证书:

1.2.2.1 dns方式验证

export CF_Key="slfjksjffjfhfhkjhfksjf" //此处替换成你自己的Key
export CF_Email="yourcloudflare@gmail.com" //此处填写你给Cloudflare绑定的邮箱账号

acme.sh --issue --dns dns_cf -d yourdomain.com -d www.yourdomain.com -k ec-256

说明:Cloudflare 目前不支持.tk .cf .ml等免费申请来的域名后缀使用此 DNS 验证方式,付费域名才受支持,免费域名使用低于 2.2.2 方式。脚本申请到的证书和密钥都放在目录下~/.acme.sh/yourdomain.com_ecc。

1.2.2.2 http方式验证 执行下面命令前请保证你80端口没有被其他程序使用,如果有,kill掉,执行下面命令前需要你先在cloudflare dns那里添加好一条记录可以,开启cloudflare cdn(cdn此时http方式验证无)影响):

acme.sh --issue --standalone -d yourdomain.com -d www.yourdomain.com -k ec-256

说明:跟上面一样,脚本申请到的证书放在~/.acme.sh/yourdomain.com_ecc目录下

1.2.3 安装证书到指定位置 如果linux主机里已有/root/ssl目录,现在已经把证书和密钥安装到这个目录下,那么执行下面的命令即可:

acme.sh --installcert -d yourdomain.com -d www.yourdomain.com --fullchain-file /root/ssl/web.crt --key-file /root/ssl/web.key --ecc

1.3、证书更新 但从letscncrypt申请证书到的程度是90天,脚本会每60天到证书进行更新,后续可能会持续这个时间,都是自动的。

# 手动强制更新证书
acme.sh --renew -d yourdomain.com -d www.yourdomain.com --force --ecc

二、局部API 本文主要以Debian10为例,介绍使用新的cloudflare api令牌来申请证书,免费域名已不受cloudflare第一方式来申请证书,请使用付费域名。

2.1、安装配置acme.sh脚本

以root用户ssh登陆到主机,使用下面命令安装配置脚本:

更新源并安装socat

apt update && apt -y install socat

# 安装脚本
wget -qO- get.acme.sh | bash

# 让脚本在.bashrc文件追加的一行环境变量生效,以后无论在哪里直接使用acme.sh,不用输绝对路径
source ~/.bashrc

# 由于最新acme.sh脚本默认ca变成了zerossl,现执行下面命令修改脚本默认ca为letsencrypt
acme.sh --set-default-ca --server letsencrypt

2.2、配置Cloudflare积分令牌 2.2.1 创建代币 根据acme.sh作者脚本提供的文档:使用新的cloudflare api令牌,需要新创建此令牌方可使用:

CleanShot 2025-05-12 at 08.27.04@2x

CleanShot 2025-05-12 at 08.27.13@2x

CleanShot 2025-05-12 at 08.27.22@2x

其中图片设置即可,选择添加区域-DNS-编辑和区域-区域-读取权限,区域资源里面包括-账户的所有区域-你的账户

CleanShot 2025-05-12 at 08.27.38@2x

配置好以后,点击创建令牌,注意此令牌token只会出现一次,切记保存,切记保存,切记保存!!!

2.2.2 获取账户ID和区域ID 根据acme.sh文档,申请证书可能还需要提供两个ID,其中账户ID必须,区域ID可有无,根据下图方法获取这两个ID:

CleanShot 2025-05-12 at 08.27.57@2x

下拉,找到API区域:

CleanShot 2025-05-12 at 08.28.09@2x

至此,即准备好申请证书所需的材料:

# 上面第一步创建的令牌,即为token
CF_Token="xxxxxxx"

# 根据上图分别获取账户ID和区域ID
CF_Account_ID="aaaaaaaa"
CF_Zone_ID="bbbbbbbbb"   //此项非必须

2.3、申请配置证书

2.3.1 申请证书 如果您的域名是example.com,执行下面命令申请证书,非root用户也执行:

# 执行此命令设置变量的值,acme.sh脚本执行过程会读取
export CF_Token="xxxxxxx"
export CF_Account_ID="aaaaaaa"
export CF_Zone_ID="bbbbbbbb"   //此项非必须,上面两项需要提供

# 申请证书
acme.sh --issue -d example.com -d *.example.com --dns dns_cf -k ec-256

2.3.2 安装证书到指定位置

如果linux主机里已有/etc/ssl目录,现在已经把证书和密钥安装到这个目录下,那么执行下面的命令即可:

acme.sh --installcert -d example.com -d *.example.com --fullchain-file /etc/ssl/web.crt --key-file /etc/ssl/web.key --ecc

# 用--reloadcmd指定安装证书后的命令
acme.sh --installcert -d example.com -d *.example.com --fullchain-file /etc/ssl/web.crt --key-file /etc/ssl/web.key --ecc --reloadcmd "systemctl restart webserver"

说明:脚本更新完证书后,会自动遵循上面指定的绝对路径将证书和密钥安装到指定位置,并根据–reloadcmd执行相应的操作。

------------------------

例:我的ssl目录路径为:

#nginxg配置文件里的证书路径,只限于我自己使用,你们随意
   ssl_certificate /etc/nginx/certs/web.crt;
   ssl_certificate_key /etc/nginx/certs/web.key;
acme.sh --installcert -d 29.xyz -d *.29.xyz --fullchain-file /root/data/docker_data/nginx/certs/web.crt --key-file /root/data/docker_data/nginx/certs/web.key --ecc

#安装到我指定的路径

-------------------------

2.3.3 证书更新 从letsencrypt申请到的证书有效期是90天,脚本每60天将进行证书更新,你也可以手动强制更新:

# 查询域名申请证书信息
acme.sh --list

# 自动更新证书
~/.acme.sh/acme.sh --upgrade --auto-upgrade

# 手动强制更新证书
acme.sh --renew -d example.com -d *.example.com --force --ecc
acme.sh --renew -d example.com -d *.example.com --force //非ECC证书使用此命令

附一份nginx.conf完整的反向代理配置文件供参考:

events {
    worker_connections 1024;
}

http {
    client_max_body_size 4096m;

    server {
        listen 80;
        listen [::]:80;
        server_name 29.xyz;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name 29.xyz;
        ssl_certificate /etc/nginx/certs/web.crt;
        ssl_certificate_key /etc/nginx/certs/web.key;

        location / {
            proxy_pass http://192.168.8.8:8008;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    server {
        listen 80;
        listen [::]:80;
        server_name s.29.xyz;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name s.29.xyz;
        ssl_certificate /etc/nginx/certs/web.crt;
        ssl_certificate_key /etc/nginx/certs/web.key;

        location / {
            proxy_pass http://192.168.8.8:12332;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

#html静态网页
server {

    listen 80;

    server_name hp.29.xyz;

    return 301 https://$server_name$request_uri;

}

server {

    listen 443 ssl;

    server_name hp.29.xyz;

    ssl_certificate /etc/nginx/certs/web.crt;

    ssl_certificate_key /etc/nginx/certs/web.key;

    

    charset utf-8;  # 添加这行来指定编码

    location / {

#解决css.js加载

        include mime.types;  
        
        default_type application/octet-stream;

##解决css.js完毕  

        root /usr/share/nginx/html;

        index index.html;

    }

  

}

##静态网页完
    
}