跳到主要内容

Caddy自动HTTPS教程

· 阅读需 13 分钟
Kevin2li
PDF Guru Anki开发者

本期教程介绍如何使用Caddy实现网站的https访问。

注意
  1. 本教程以example.com作为示例域名,用户需要自行将所有地方出现的example.com修改为自己的实际域名。
  2. 用户已经有一个云服务器,并且有一个可通过公网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 EncryptZeroSSL申请、配置和续期免费的域名证书,比较方便。当然如果你已经有了域名证书,也可以在Caddy中直接指定。

说明

本教程使用的TLS配置为Mozilla SSL Configuration Generator生成的Intermediate级别配置,适用于绝大部分场景。

Caddy支持多种自动申请证书的方式,详见:Automatically HPPS | Caddy

这里介绍最常用的两种方式:HTTP challengeDNS 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

文件内容如下:

注意

将下面文件中的emailexample.com替换为你的实际邮箱和实际域名。

/etc/caddy/Caddyfile
{
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
}
}
VI编辑器使用说明

输入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
VI编辑器使用说明

输入i进入输入模式,粘贴上面的内容,然后按ESC回到正常模式,输入:wq即可退出并保存文件。

重载系统服务

sudo systemctl daemon-reload
sudo systemctl enable --now caddy
sudo systemctl status caddy

当出现类似下面提示,说明安装成功。

配置反向代理

获取DNS访问密钥

参考:https://support.dnspod.cn/account/dnspod-token/

登录DNSPod 账号中心控制台,依次单击账号中心->密钥管理

在密钥管理控制台中,单击创建密钥。如下图所示。

保管好生成的IDToken,后面会用到。

编写Caddyfile

参考链接:https://github.com/caddy-dns/dnspod

终端中依次输入下面命令,创建一个Caddyfile文件

sudo rm -rf /etc/caddy/Caddyfile
sudo vi /etc/caddy/Caddyfile

文件内容如下:

注意

将下面文件中的

  • emailexample.com替换为你的实际邮箱和实际域名。
  • DNSPOD_TOKEN替换为你的实际密钥,格式为:ID,Token
    • 例如ID为13490,ToKen为6b5976c68aba5b14a0558b77c17c3932,则DNSPOD_TOKEN13490,6b5976c68aba5b14a0558b77c17c3932
/etc/caddy/Caddyfile
{
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
}
}
VI编辑器使用说明

输入i进入输入模式,粘贴上面的内容,然后按ESC回到正常模式,输入:wq即可退出并保存文件。

重启服务

终端中输入下面命令:

sudo systemctl restart caddy
sudo systemctl status caddy

当出现类似下面提示,说明证书申请成功。

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

手动指定证书

如果你已经有了域名证书,也可以直接指定使用你的证书。

查看详情

安装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

文件内容如下:

注意

将下面文件中的

  • emailexample.com替换为你的实际邮箱和实际域名。
  • <your_cert.pem><your_key.pem>分别替换为你的证书路径和密钥路径。
/etc/caddy/Caddyfile
{
email you@yours.com
}

*.example.com, example.com {
header {
Strict-Transport-Security "max-age=63072000"
}
tls <your_cert.pem> <your_key.pem> {
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
}
}
VI编辑器使用说明

输入i进入输入模式,粘贴上面的内容,然后按ESC回到正常模式,输入:wq即可退出并保存文件。

重启服务

终端中输入下面命令:

sudo systemctl restart caddy
sudo systemctl status caddy

当出现类似下面提示,说明证书申请成功。

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