跳至正文
  • 8 views
  • 2 min read

certbot为 cloudflare 申请泛域名证书并自动续期

新浪微博 豆瓣 QQ 百度贴吧 QQ空间

概述

普通单个域名的证书申请和续期比较简单,一行命令然后配置crontab周期执行续期即可。泛域名就是*.domain.com, 域名下面的子域名全部共用一个泛域名证书,但是续期会麻烦一些,需要用到域名服务商的验证。Certbot 支持自动申请 LetsEncrypt 的泛域名证书。通常aliyun和Cloudflare都有提供域名管理的API,配置自动申请和续期需要先拿到API的key和secret.

本操作针对centos和nginx,为了规避各种目录权限问题,建议使用root权限运行。

基础配置

如果已经有python3,则先yum update升级到最新版本,没有则安装python3并启动venv虚拟环境

# 使用root运行所有命令
yum install -y python36
mkdir -p /opt/certbot
cd /opt/certbot
python3 -m venv venv
source venv/bin/activate
# 更新pip
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

使用阿里云注册并解析的域名执行如下命令,安装证书基础模块

# 在venv中执行,临时使用国内源
pip install certbot certbot-nginx certbot-dns-aliyun -i https://pypi.tuna.tsinghua.edu.cn/simple

使用cloudfalre管理解析的域名执行如下命令

pip install certbot certbot-nginx certbot-dns-cloudflare -i https://pypi.tuna.tsinghua.edu.cn/simple

基础工作完成。

阿里云申请证书

安全实践,首先在对应域名管理的aliyun账号中创建 子账号AccessKey,创建一个只有Dnsfullaccess权限的子账号,需要注意的是,当子账号Accesskey创建成功后,请及时点击下载key文件,不然后面就找不到了。。权限随时都可以配置修改。后面需要用到这个key和secret.

图像

完成后将key和secret写入验证ini文件,这个文件名可以自定义,这里使用cybersir.ini,也可以手动创建文件并写入key和secret这两行

cat > cybersir.ini <<EOF
certbot_dns_aliyun:dns_aliyun_access_key = 这里是key字符串
certbot_dns_aliyun:dns_aliyun_access_key_secret = 这里是secret字符串
EOF
# 确保只有root有读写权限
chmod 600 cybersir.ini

确保生成证书的域名是在上面的阿里云账户的管理解析之下,否则无法完成证书创建。生成的主域名必须先列出,然后才是泛域名,所以有两个-d

/opt/certbot/venv/bin/certbot certonly \
-a certbot-dns-aliyun:dns-aliyun \
--certbot-dns-aliyun:dns-aliyun-credentials /opt/certbot/cybersir.ini \
-d cybersir.com \
-d "*.cybersir.com"

Cloudflare证书申请

使用cf账户登录dashboard页面,在右侧可以查看apikey,这里配置文件名自定义为cybersir_cf.ini

cat > cybersir_cf.ini <<EOF
dns_cloudflare_email = cloudflare_email_account登录邮件
dns_cloudflare_api_key = api_key
EOF
# 确保只有root有读写权限
chmod 600 cybersir.ini

生成证书方法和阿里云类似,替换掉对应的cf模块即可

/opt/certbot/venv/bin/certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /opt/certbot/cybersir_cf.ini \
-d cybersir.com \
-d "*.cybersir.com"

Nginx网站证书配置

找到nginx网站配置文件,通常在/etc/nginx/conf.d和/etc/nginx/sites-enabled目录下,将如下片段添加到server内容区块中,详细配置可参考nginx在线配置生成

listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/cybersir.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/cybersir.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

完成以上配置后,重载nginx服务

# 验证配置
nginx -t
# 重载服务
systemctl reload nginx
# 或者这种重载
nginx -s reload

自动续期设置

自动续期是通过crontab来实现的,生成的证书只有90天时效,我们设置每60天重新renew续期一次,每月一次也是可以的

crontab -e
# 启动crontab编辑保存
30 0 * */2 *  root /opt/certbot/venv/bin/certbot renew --quiet --post-hook "systemctl reload nginx" > /dev/null 2>&1

发表回复