MENU

国内使用Caddy和CloudFlare实现SSL自动证书

August 7, 2024 • Read: 423 • 技术杂谈

家庭服务器上面装了不少服务,一两个还好,但是多了之后证书的维护就是一件麻烦事(懒),而且免费证书一般只有三个月有效期,那更是麻烦。

本来Caddy本身是可以自动实现SSL自动证书的,但由于国情特色家里的公网IP无法使用80 443端口,只能通过acme dns challenge的方式自动申请证书和维护。一开始我的域名备案完整且托管在dnspod,结果 caddy 并没有适配国内的dnspod 模块无法使用,转而使用赛博菩萨Cloudflare。

前期准备

  1. 已经在服务器安装好Caddy软件且能够正常运行(默认不带caddy-dns/cloudflare模块)。
  2. 替换带caddy-dns/cloudflare模块的二进制文件,下载地址:https://caddyserver.com/download?package=github.com%2Fcaddy-dns%2Fcloudflare
    caddy-dns:cloudflare.png

下载完成手动替换caddy文件,并给予执行权限,最后手动执行caddy list-modules | grep cloudflare出现以下结果即说明安装替换成功。

root@homeserver:~# caddy list-modules | grep cloudflare
dns.providers.cloudflare
root@homeserver:~# 

Cloudflare 域名配置

  1. 将域名成功托管到Cloudflare,步骤略。
  2. 创建ApiToken,用于给Caddy自动完成TXT配置。

caddy-dns-cloudflare-api-token.png

安装如图流程创建Api令牌,注意权限设置。

配置文件

个人更喜欢Json风格,大概配置如下:

{
    "admin": {
        "disabled": true
    },
    "logging": {
        "logs": {
            "default": {
                "writer": {
                    "output": "file",
                    "filename": "/var/log/caddy/access.log"
                },
                "encoder": {
                    "format": "console"
                },
                "level": "INFO"
            }
        }
    },
    "apps": {
        "http": {
            "http_port": 8880,
            "https_port": 8888,
            "servers": {
                "http": {
                    "listen": [
                        ":8888"
                    ],
                    "routes": [
                        {
                            "match": [
                                {
                                    "host": [
                                        "draw.vizan.one"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "reverse_proxy",
                                    "upstreams": [
                                        {
                                            "dial": "127.0.0.1:8802"
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "match": [
                                {
                                    "host": [
                                        "mind.vizan.one"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "reverse_proxy",
                                    "upstreams": [
                                        {
                                            "dial": "127.0.0.1:8803"
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "match": [
                                {
                                    "host": [
                                        "alist.vizan.one"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "reverse_proxy",
                                    "upstreams": [
                                        {
                                            "dial": "127.0.0.1:8804"
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            "match": [
                                {
                                    "host": [
                                        "tools.vizan.one"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "reverse_proxy",
                                    "upstreams": [
                                        {
                                            "dial": "127.0.0.1:8805"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            }
        },
        "tls": {
            "automation": {
                "policies": [
                    {
                        "subjects": [
                            "[你的域名]"
                        ],
                        "issuers": [
                            {
                                "module": "acme",
                                "email": "[你的邮箱]",
                                "challenges": {
                                    "dns": {
                                        "provider": {
                                            "name": "cloudflare",
                                            "api_token": "[你的Cloudflare API令牌]"
                                        },
                                        "resolvers": [
                                            "1.1.1.1",
                                            "1.0.0.1"
                                        ]
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}

按照以上的配置格式,修改为自己参数即可,最后systemctl restart caddy重启即可自动申请证书;如果有问题可以查看日志文件/var/log/caddy/access.log

效果展示