生成
免费 SSL 一键部署命令生成
选好 Web 服务器、ACME 客户端和验证方式,就能拿到申请免费证书并自动续期的全部命令,从安装客户端到最后的检查,复制粘贴即可。
浏览器本地运行 你输入的内容只在本地用 JavaScript 处理,不会上传到 ssl.sh。
这个生成器帮你写好申请 Let's Encrypt 免费证书并自动续期的全部命令。选择 Web 服务器、ACME 客户端和验证方式后,把编号步骤依次粘贴到服务器的 root 终端:安装客户端,按需填写 DNS API 密钥,申请证书,接入 Nginx 或 Apache,确认自动续期,最后用 curl ssl.sh/你的域名 检查结果。生成过程完全在浏览器里完成。
如果没有服务器的命令行权限,比如虚拟主机,或只能上传证书的 CDN、云控制台,请改用免费 SSL 证书申请工具。
使用方法
- 域名:证书要包含的域名,例如
example.com www.example.com。勾选“包含通配符”会加上*.example.com,并去掉已被通配符覆盖的子域名。 - Web 服务器:Nginx、Apache、其他或没有 Web 服务器、Caddy、宝塔面板。Caddy 和宝塔会自己申请证书,生成器给出对应的配置或面板操作步骤。
- 操作系统:Ubuntu/Debian 或 RHEL 系(Rocky、AlmaLinux、CentOS Stream),影响安装命令和 Apache 服务名(
apache2或httpd)。 - ACME 客户端:certbot 或 acme.sh,区别见下表。
- 验证方式:HTTP(80 端口)或 DNS API。通配符证书只能用 DNS。
- 更多选项:密钥类型(默认 ECDSA P-256,需要兼容很老的客户端时选 RSA 2048)、可选的邮箱,以及 acme.sh 的 Gitee 镜像(服务器在中国大陆时建议勾选)。
certbot 和 acme.sh 对比
两个都是成熟的 ACME 客户端,都会自动续期,主要区别在安装方式和支持的 DNS 服务商。
| certbot | acme.sh | |
|---|---|---|
| 安装 | snap 包(snap install --classic certbot) |
Shell 脚本装到 ~/.acme.sh,国内可用 Gitee 镜像 |
| 默认 CA | Let's Encrypt | ZeroSSL,用 --set-default-ca --server letsencrypt 切换 |
| 配置 Web 服务器 | --nginx、--apache 插件直接改配置 |
--install-cert 复制证书并记住 --reloadcmd |
| DNS API | Cloudflare、Route 53 等官方插件 | 一百多家,包括阿里云 DNS(dns_ali)和腾讯云 DNSPod(dns_tencent) |
| 续期 | systemd 定时器 snap.certbot.renew.timer |
cron 任务执行 acme.sh --cron |
| 证书路径 | /etc/letsencrypt/live/<域名>/ |
由 --install-cert 指定 |
选了 certbot 又选了它没有官方插件的 DNS 服务商(阿里云、DNSPod 等)时,生成器会自动改用 acme.sh 并给出提示。
每一步在做什么
- 安装:certbot 按 certbot.eff.org 的推荐用 snap 安装,DNS 插件需要先允许
trust-plugin-with-root。acme.sh 以 root 安装并添加 cron 任务,然后把默认 CA 切换到 Let's Encrypt。 - DNS 密钥:certbot 读取权限为 600 的
/root/.secrets/cloudflare.ini或 root 用户的 AWS 凭据;acme.sh 第一次读取export的环境变量后,会保存到~/.acme.sh/account.conf,续期时自动使用。 - 申请证书:certbot 的 Nginx、Apache 插件一条命令完成 HTTP 验证、安装证书和 HTTPS 跳转。其他情况用
certonly配合--webroot、--standalone或 DNS 插件,并加上--deploy-hook,每次续期后自动重载服务器。 - 安装和配置:acme.sh 和 certbot
certonly之后,会给出ssl_certificate或SSLCertificateFile配置行。协议和密码套件可以用 TLS 配置生成器 补全。 - 确认续期:最后的命令只是确认定时任务存在;
certbot renew --dry-run会在测试环境完整演练一次续期。
运行前确认
- HTTP 验证时,每个域名都要解析到这台服务器,80 端口要在防火墙和云服务器安全组里放行。
- 服务器在中国大陆、域名没有备案时,云厂商通常会拦截 80 端口访问,请用 DNS 验证。
- 域名有 CAA 记录时,必须有一条允许
letsencrypt.org,可以用 CAA 检查 确认。 - 第一次尝试可以先用测试环境:certbot 加
--test-cert,acme.sh 加--staging,失败不会占用正式环境的频率限制。
带排错说明的完整教程:acme.sh + 阿里云/DNSPod、Nginx + certbot、Apache + certbot、certbot + Cloudflare 通配符、宝塔面板 和 Caddy。
常见问题
certbot 和 acme.sh 选哪个?
certbot 是 EFF 官方客户端,用 snap 安装,能自动修改 Nginx 或 Apache 配置,资料最多。acme.sh 是一个 Shell 脚本,不依赖软件包管理器,支持的 DNS API 多得多(包括阿里云和 DNSPod),国内服务器更常用。两者都会自动续期。
HTTP 验证和 DNS 验证怎么选?
每个域名都已解析到这台服务器、80 端口能从公网访问时,用 HTTP 验证,不需要任何密钥。要申请通配符证书、服务器没开 80 端口、域名接了 CDN 或者没有备案时,用 DNS 验证,需要一个能修改解析记录的 API 密钥,权限给到最小即可。
还需要自己写 crontab 续期吗?
不需要。certbot 的 snap 包自带 systemd 定时器 snap.certbot.renew.timer,acme.sh 安装时会自动添加 cron 任务。生成的最后几条命令只是确认它们存在,certbot 还会做一次续期演练(--dry-run)。
为什么 acme.sh 要执行 --set-default-ca?
acme.sh 从 3.0 版开始默认向 ZeroSSL 申请证书,需要先注册邮箱。这条命令把默认 CA 改成 Let's Encrypt,不需要邮箱,也和后面的步骤一致。
宝塔面板也要用命令行吗?
不用。宝塔在“网站 → 设置 → SSL”里内置了 Let's Encrypt,选宝塔面板时生成器只给出面板里的操作步骤。如果你想用 acme.sh 管理宝塔站点的证书,要把证书安装路径和重载命令改成宝塔的,并关闭面板对该站点的自动续签,避免两边互相覆盖。