Caddy自动HTTPS教程
本期教程介绍如何使用Caddy实现网站的https访问。
- 本教程以
example.com
作为示例域名,用户需要自行将所有地方出现的example.com
修改为自己的实际域名。 - 用户已经有一个云服务器,并且有一个可通过公网IP访问的网站,例如
http://1.2.3.4:5244
。
域名购买
为了使用https访问,你需要先申请一个域名,例如example.com
。下面列举一些常用的域名服务提供商,用户可自行选择:
一般建议你的云服务器是哪家的,就选择哪家的域名服务。
域名解析
域名购买后,可以在域名控制台中将域名解析到你的云服务器的公网IP上。
例如将alist.example.com
解析到你的公网IP上。
这里以阿里云为例,演示如何添加域名解析记录。
打开云解析DNS控制台,点击『添加记录』按钮。

添加A类型解析记录,记录值填写公网IP。

域名备案
为了能够正常通过域名访问你的网站或服务,你还需要经过ICP备案和公安备案,如实填写你的网站用途、负责人等信息。备案通过后才能正常使用域名。详细步骤可以咨询你的域名服务提供商。
反向代理
反向代理,区别于一般意义上的代理(即作为客户端的代理),反向代理是对服务端的代理。
前面我们已经实现直接通过公网IP的方式访问web服务,例如http://server-ip:5244
。为了实现域名访问,还需要配置下反向代理,将对域名的访问请求转发到主机对应端口提供的服务中去。
我们使用Caddy工具来配置反向代理。

要实现https访问,需要有域名证书。Caddy支持自动从Let's Encrypt或ZeroSSL申请、配置和续期免费的域名证书,比较方便。当然如果你已经有了域名证书,也可以在Caddy中直接指定。
本教程使用的TLS配置为Mozilla SSL Configuration Generator生成的Intermediate
级别配置,适用于绝大部分场景。
Caddy支持多种自动申请证书的方式,详见:Automatically HPPS | Caddy。
这里介绍最常用的两种方式:HTTP challenge和DNS challenge。用户选择其中一种即可,推荐使用前者更简单方便。
使用HTTP challenge自动申请证书(推荐)
此方式需要开放服务器的80和443端口。可以在云服务器控制台的安全组管理中确认是否已放行80和443端口。
查看详情
安装Caddy
在终端中依次输入下面命令:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
验证安装成功
终端中输入下面命令:
caddy version
出现类似下面提示,表示安装成功。

配置反向代理
编写Caddyfile
终端中依次输入下面命令,创建一个Caddyfile
文件
sudo rm -rf /etc/caddy/Caddyfile
sudo vi /etc/caddy/Caddyfile
文件内容如下:
将下面文件中的email
和example.com
替换为你的实际邮箱和实际域名。
{
email you@yours.com
}
*.example.com, example.com {
header {
Strict-Transport-Security "max-age=63072000"
}
tls {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
}
@alist host alist.example.com
handle @alist {
reverse_proxy 127.0.0.1:5244
encode zstd gzip
}
handle {
abort
}
}
输入i
进入输入模式,粘贴上面的内容,然后按ESC
回到正常模式,输入:wq
即可退出并保存文件。
重启服务
终端中输入下面命令:
sudo systemctl restart caddy
sudo systemctl status caddy
当出现类似下面提示,说明证书申请成功。

然后可以浏览器通过域名访问网站测试下,例如访问https://alist.example.com
, 第一次申请证书可能要等几分钟才能正常访问。
使用DNS challenge自动申请证书
此方式需要去域名提供商获取DNS的API密钥。
查看详情
安装Caddy
可以去Caddy官网上下载二进制可执行文件。
如果你使用的是腾讯云、阿里云等域名提供商,需要下载安装集成了对应插件版本的Caddy。
- 腾讯云域名
- 阿里云域名


方便起见,这里也提供了集成了腾讯云和阿里云插件的Caddy版本下载:Caddy_linux_amd64_dnspod_alidns | 百度云
下载好后,将文件上传至云服务器,并重命名为caddy
。
然后在终端中依次输入下面命令;
sudo mv /path/to/caddy /usr/bin # 注意将前面的路径替换为你实际的Caddy路径
sudo chmod +x /usr/bin/caddy
验证安装成功
终端中输入下面命令:
caddy version
出现类似下面提示,表示安装成功。

设置为系统服务
创建caddy用户组和用户。
sudo groupadd --system caddy
sudo useradd --system \
--gid caddy \
--create-home \
--home-dir /var/lib/caddy \
--shell /usr/sbin/nologin \
--comment "Caddy web server" \
caddy
编写服务文件。
sudo vi /etc/systemd/system/caddy.service
文件内容如下:
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
输入i
进入输入模式,粘贴上面的内容,然后按ESC
回到正常模式,输入:wq
即可退出并保存文件。
重载系统服务
sudo systemctl daemon-reload
sudo systemctl enable --now caddy
sudo systemctl status caddy
当出现类似下面提示,说明安装成功。

配置反向代理
- 腾讯云域名
- 阿里云域名
获取DNS访问密钥
登录DNSPod 账号中心控制台,依次单击账号中心->密钥管理。
在密钥管理控制台中,单击创建密钥。如下图所示。

保管好生成的ID
和Token
,后面会用到。

编写Caddyfile
终端中依次输入下面命令,创建一个Caddyfile
文件
sudo rm -rf /etc/caddy/Caddyfile
sudo vi /etc/caddy/Caddyfile
文件内容如下:
将下面文件中的
email
和example.com
替换为你的实际邮箱和实际域名。DNSPOD_TOKEN
替换为你的实际密钥,格式为:ID,Token
。- 例如ID为
13490
,ToKen为6b5976c68aba5b14a0558b77c17c3932
,则DNSPOD_TOKEN
为13490,6b5976c68aba5b14a0558b77c17c3932
- 例如ID为
{
email you@yours.com
}
*.example.com, example.com {
header {
Strict-Transport-Security "max-age=63072000"
}
tls {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
dns dnspod DNSPOD_TOKEN
}
@alist host alist.example.com
handle @alist {
reverse_proxy 127.0.0.1:5244
encode zstd gzip
}
handle {
abort
}
}
输入i
进入输入模式,粘贴上面的内容,然后按ESC
回到正常模式,输入:wq
即可退出并保存文件。
获取DNS访问密钥
登录阿里云控制台,点击右上角头像,进入AccessKey管理
菜单。

点击"创建AccessKey"按钮。

保管好生成的AccessKey ID
和AccessKey Secret
,后面会用到。

编写Caddyfile
终端中依次输入下面命令,创建一个Caddyfile
文件
sudo rm -rf /etc/caddy/Caddyfile
sudo vi /etc/caddy/Caddyfile
文件内容如下:
将下面文件中的
email
和example.com
替换为你的实际邮箱和实际域名。ALIYUN_ACCESS_KEY_ID
和ALIYUN_ACCESS_KEY_SECRET
分别替换为你的AccessKey ID
和AccessKey Secret
{
email you@yours.com
}
*.example.com, example.com {
header {
Strict-Transport-Security "max-age=63072000"
}
tls {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
dns alidns {
access_key_id ALIYUN_ACCESS_KEY_ID
access_key_secret ALIYUN_ACCESS_KEY_SECRET
}
}
@alist host alist.example.com
handle @alist {
reverse_proxy 127.0.0.1:5244
encode zstd gzip
}
handle {
abort
}
}
输入i
进入输入模式,粘贴上面的内容,然后按ESC
回到正常模式,输入:wq
即可退出并保存文件 。
重启服务
终端中输入下面命令:
sudo systemctl restart caddy
sudo systemctl status caddy
当出现类似下面提示,说明证书申请成功。

然后可以浏览器通过域名访问网站测试下,例如访问https://alist.example.com
, 第一次申请证书可能要等几分钟才能正常访问。