在域名是内网IP环境的下申请tls证书
Easul Lv6

caddy 是一个强大的 站点托管 和 站点反向代理 的工具,但由于其默认的 tls证书申请方式 需要用到公网,所以自己的站点在局域网中使用的时候就只能用 80 端口。
在如今全民 https 的情况下,用这种方式显然不是很优雅。
于是就有了如下这篇简要的指导文档。

准备内容

  • 本地已经托管好的某个端口的服务
  • 已经解析到 内网IP 的 域名
  • acme.sh 相关文档(点击前边的 acme.sh 即可跳转到相关文档页)

相关步骤

  1. 安装 acme.sh 到本地服务器

在已经有科学上网的情况下,通过如下方式即可将 acme.sh 安装到本地。直接在普通用户下安装即可,减少赋予权限太高所带来的风险。
安装的时候可以将邮箱 my@example.com 改为自己常用的邮箱。

BASH
1
curl https://get.acme.sh | sh -s email=my@example.com

因为安装的时候需要访问 github.com ,很多情况下是无法访问通的。
所以如果安装失败,可以参考如下 国内方式 进行安装。
需首先安装 git

BASH
1
2
3
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com
  1. 准备申请证书时的相关参数

由于域名是映射的内网IP,所以需要使用 acme.sh 的 dns 方式来申请证书。
我的域名是托管在了 Cloudflare ,所以如下的参数处理方式是参考 Cloudflare 的。其他相关处理方式可以 参考这里

这里我需要准备两个参数,第一个是 API token,第二个是 Zone ID
下边的步骤主要参考了 acme.sh 的相关文档。

  • API token 的获取

获取 API token ,先点击 该链接 ,然后点击 Create Token
然后选择 Edit zone DNS 的模板来进行创建。
Permissions 选择 Zone > DNS > Edit , Zone Resources 选择 Include > Specific zone > 自己要申请证书的域名 。
然后创建即可。

最后会生成一个带有 数字,大小写字母,中划线 的字符串,将其保存下来。

  • Zone ID 的获取

进入到 Cloudflare 的首页,点击自己的域名进入。
在页面右下角的 Zone ID 区域保存自己的 ID。

  1. 进行TLS证书申请

由于我本地使用的二级域名比较多,所以我申请的是一个泛域名

BASH
1
2
3
4
5
6
7
# 设置刚刚保存的 API token
export CF_Token="my API token"
# 设置刚刚保存的 Zone ID
export CF_Zone_ID="my zone ID"
# 进行证书的申请
# 上边设置的信息会自动保存到 acme.sh 目录下的如下 域名文件夹 中
acme.sh --issue --dns dns_cf -d '*.example.com'
  1. 在 caddy 中设置证书相关的内容

上边的证书申请好之后,证书会在 ~/.acme.sh/*.example.com_ecc 相关目录存储。
需要使用目录中的 .cer.key 文件来指定证书。
如下为 Caddyfile 中的相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
test1.example.com {
# tls 参数用于指定证书,先放 pem 证书,再放 key 证书
tls /home/test/.acme.sh/*.example.com_ecc/*.example.com.cer /home/test/.acme.sh/*.example.com_ecc/*.example.com.key
# reverse_proxy 指定反向代理的服务
reverse_proxy http://localhost:3000
}
test2.example.com {
tls /home/test/.acme.sh/*.example.com_ecc/*.example.com.cer /home/test/.acme.sh/*.example.com_ecc/*.example.com.key
# 执行文件服务器的根目录
root * /home/test/workspace/docs
# 指定托管为文件服务器
file_server
}
  1. 重启 caddy ,即可以使用 https 来进行服务的访问了

后记

acme.sh 是支持 crontab 自动续期证书的,所以基本上不需要管什么。接下来就可以愉快的使用域名来访问本地IP的 https 服务了。

参考

 评论