作为一款现代化的Web服务器,Caddy在设计之初就内置了自动化HTTPS功能。与其他传统服务器不同,Caddy默认会自动从Let's Encrypt获取并管理SSL/TLS证书,整个过程无需人工干预。这种"零配置HTTPS"的特性背后,是一套精心设计的证书存储体系。
Caddy在Linux系统上运行时,会创建一个名为caddy的专用系统账户。这个账户的家目录被设置为/var/lib/caddy,所有与证书相关的文件都存储在这个目录下的特定位置。这种设计有几个关键考虑:
注意:在生产环境中,切勿手动修改/var/lib/caddy目录的权限设置,错误的权限可能导致Caddy无法自动更新证书。
Caddy的证书存储在以下路径结构中:
code复制/var/lib/caddy/.local/share/caddy/certificates/
└── acme-v02.api.letsencrypt.org-directory/
└── yourdomain.com/
├── yourdomain.com.crt
├── yourdomain.com.key
├── yourdomain.com.json
└── meta.json
这个路径的各个组成部分都有特定含义:
.local/share/caddy/:遵循XDG基本目录规范的用户级应用程序数据存储位置certificates/:所有证书文件的根目录acme-v02.api.letsencrypt.org-directory/:标识证书来自Let's Encrypt的v02 APIyourdomain.com/:以域名命名的子目录,包含该域名的所有证书文件每个域名目录下通常包含以下几种文件:
.crt文件:这是证书链文件,包含:
.key文件:私钥文件,这是最敏感的部分,默认权限为600(仅所有者可读写)
.json文件:证书的元数据,包括获取时间、到期时间等信息
meta.json:ACME协议相关的账户和订单信息
当需要手动检查或备份证书时,可以通过以下命令定位证书:
bash复制sudo ls -l /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
如果要查看特定域名的证书详情:
bash复制sudo openssl x509 -in /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.com/example.com.crt -text -noout
虽然Caddy会自动管理证书更新,但定期备份证书仍然是推荐做法。以下是简单的备份脚本示例:
bash复制#!/bin/bash
BACKUP_DIR="/backup/caddy_certs/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
sudo cp -a /var/lib/caddy/.local/share/caddy/certificates "$BACKUP_DIR"
sudo chown -R $(whoami): "$BACKUP_DIR"
echo "证书已备份至 $BACKUP_DIR"
当配置多个域名时,Caddy会为每个域名创建独立的子目录:
code复制/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
├── example.com/
├── api.example.com/
└── blog.example.com/
对于通配符证书,目录名会包含星号前缀:
code复制/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
└── *.example.com/
虽然不建议修改默认位置,但在某些特殊情况下(如使用网络存储),可以通过Caddyfile配置:
code复制{
storage file_system /custom/cert/path
}
或者在JSON配置中:
json复制{
"storage": {
"module": "file_system",
"root": "/custom/cert/path"
}
}
警告:修改存储位置后,需要确保Caddy进程对新目录有读写权限,同时要迁移现有证书文件,否则Caddy会重新申请证书。
如果使用非Let's Encrypt的ACME服务商,路径中的acme-v02.api.letsencrypt.org-directory会相应变化。例如,使用ZeroSSL的路径会是:
code复制/var/lib/caddy/.local/share/caddy/certificates/acme.zerossl.com-v2-dv90/
如果遇到证书更新问题,首先检查存储目录的权限:
bash复制sudo ls -ld /var/lib/caddy /var/lib/caddy/.local /var/lib/caddy/.local/share /var/lib/caddy/.local/share/caddy
正确的权限应该是:
如果怀疑证书文件损坏,可以尝试以下步骤:
bash复制sudo rm -rf /var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/example.com/
bash复制sudo systemctl reload caddy
Caddy会自动重新申请新的证书。
迁移Caddy服务器时,需要完整复制证书目录:
bash复制# 在源服务器上
tar czf caddy-certs.tar.gz -C /var/lib/caddy/.local/share/caddy certificates
# 在目标服务器上
sudo tar xzf caddy-certs.tar.gz -C /var/lib/caddy/.local/share/caddy
sudo chown -R caddy:caddy /var/lib/caddy/.local/share/caddy/certificates
定期审计证书:使用以下命令列出所有已存储的证书:
bash复制sudo find /var/lib/caddy/.local/share/caddy/certificates -name "*.crt" -exec openssl x509 -noout -subject -dates -in {} \;
监控证书过期:虽然Caddy会自动更新,但添加监控仍是好习惯:
bash复制sudo openssl x509 -enddate -noout -in /path/to/cert.crt
私钥保护:确保.key文件权限始终为600:
bash复制sudo find /var/lib/caddy/.local/share/caddy/certificates -name "*.key" -exec chmod 600 {} \;
日志检查:Caddy的证书操作日志可以通过journalctl查看:
bash复制sudo journalctl -u caddy --since "1 hour ago" | grep -i acme
在实际运维中,理解Caddy的证书存储机制能帮助你更有效地管理HTTPS服务。虽然Caddy的自动化设计减少了手动干预的需求,但在故障排查、迁移和备份场景下,这些知识就显得尤为重要。