1987WEB视界-分享互联网热点话题和事件

您现在的位置是:首页 > 域名 > 正文

域名

使用Certbot申请泛域名SSL证书(LetsEncrypt)

1987web2023-09-27域名77
写在前面(欢迎访问我的个人博客,获得更好的阅读体验)

写在前面

(欢迎访问我的个人博客,获得更好的阅读体验)

在开始本篇教程之前,你需要:

  1. 确保域名成功解析到服务器ip,并确保你的服务器80端口没有被占用。
  2. 你可能需要到服务器控制台检查80和443端口是否开放。
  3. 本篇教程使用Nginx进行反向代理,当然你也可以使用Caddy等其他工具,申请SSL证书的步骤基本相同。

使用Nginx进行反向代理配置

1.安装Nginx

添加 Nginx 源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

 安装 Nginx
sudo yum install -y nginx

 启动 Nginx
sudo systemctl start nginx.service

 设置开机自启 Nginx
sudo systemctl enable nginx.service

2.配置Nginx

现在你需要为你的服务创建一个单独的Nginx配置文件,如下示例:

使用 vim 创建 demo.conf
vim /etc/nginx/conf.d/demo.conf

 创建以下内容
server {
    listen 80;

    server_name example.com www.example.com; 你的域名

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://127.0.0.1:1000/; 你的服务地址
    }
}

修改完成之后

检查配置是否有误
sudo nginx -t

 重载 Nginx 配置
sudo nginx -s reload

使用certbot申请SSL证书

1.为单域名申请SSL证书

安装 certbot 以及 certbot nginx 插件
sudo yum install certbot python2-certbot-nginx -y

 执行配置,中途会询问你的邮箱,如实填写即可
sudo certbot --nginx

 自动续约
sudo certbot renew --dry-run

至此,SSL证书的配置就完成了,申请成功的话,证书文件会存放在/etc/letsencrypt/archive/http://example.com/目录下,由于我们采用的是自动操作,所以Nginx配置certbot会帮我们配置好。如果没有问题,demo.conf会自动更新为以下内容:

server {

    server_name example.com www.example.com;

    client_max_body_size 1024m;

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://127.0.0.1:1000/;
    }

    listen 443 ssl;  managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;  managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.example.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

}
server {
    if ($host = www.example.com) {
        return 301 https://$host$request_uri;
    }  managed by Certbot

    listen 80;

    server_name example.com www.example.com;
    return 404;  managed by Certbot
}

你现在可以试着用https访问一下你的网站。 但是如果我们想为一些子域名也配置Https访问,还需要进一步的设置。

2.为子域名申请Https

注意,不推荐此方法来为子域名配置Https,该方法仅作为了解,或者你的子域名较少的情况下,可以使用此方法进行配置。

假如你已经已经使用Certbot生成了证书,并且想为别的域名申请证书。例如已经有一张域名为www.example.com的SSL证数,现在想申请一张域名为blog.example.com的SSL证书,可以使用下面的命令:

为其他域名申请证书
sudo certbot --expand -d www.example.com,blog.example.com

 撤销已经申请的证数
sudo certbot revoke --cert-path /etc/letsencrypt/archive/example.com/cert1.pem

3.申请泛域名HTTPS证书以及配置自动续约

不管是申请还是续期,只要是通配符证书,只能采用 dns-01 的方式校验申请者的域名,也就是说每次续期证书我们都必须登录控制台添加对应的TXT记录才可以续期/申请成功,这样不免有些麻烦。好在certbot提供了一个hook,可以调用域名提供商的Api接口来添加TXT记录而无需人工干预,但是官方并不支持国内的大部分服务商,这样就要用到第三方的插件了。我用的是这个:certbot-letencrypt-wildcardcertificates-alydns-au使用方法作者写的很详细,这里提供本地化的使用方法: 1. 下载

clone工具到本地
git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au  

 或者使用我的备份
wget https://www.dlice.xyz/certbot-letencrypt-wildcardcertificates-alydns-au-2018-12.tar.gz

cd certbot-letencrypt-wildcardcertificates-alydns-au

chmod 0777 au.sh
  1. 配置
  2. domain.ini:使用vim编辑器打开,检查默认域名信息,若没有自己的根域名需要自行添加。
  3. au.sh :登录控制台获取API秘钥,然后配置在该文件的相应位置。
  4. 申请证书 首先我们来验证一下工具是否可以正常执行:
sudo certbot certonly  
-d example.com -d *.example.com              域名列表
--manual                     手动模式申请
--preferred-challenges dns           验证方式为dns认证
--dry-run                    测试
--manual-auth-hook "/etc/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add"         申请之前添加TXT记录
--manual-cleanup-hook "/etc/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"        申请之后删除TXT记录
--pre-hook "systemctl stop nginx.service"    前置钩子:停止Nginx服务
--post-hook "systemctl start nginx.service"  后置钩子:开启Nginx服务

注意:--manual-auth-hook 和 --manual-cleanup-hook 有三个参数: + 第一个代表你要选择那种语言(php/python),需要在au.sh中配置相应的路径; + 第二个参数代表你的DNS厂商(aly/txy); + 第三个参数是固定的(--manual-auth-hook中用add,--manual-clean-hook中用clean);

如果测试遇到相关问题,可以查看 /var/log/certd.log。 确认无误后,实际运行(去除 --dry-run 参数):

sudo certbot certonly -d dlice.xyz -d *.dlice.xyz --manual --preferred-challenges dns --manual-auth-hook "/etc/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/etc/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean" --pre-hook "systemctl stop nginx.service" --post-hook "systemctl start nginx.service"
  1. 配置Nginx 申请成功后,证书文件会存放在/etc/letsencrypt/archive/your-domain/目录下,不过由于是手动申请,我们需要自己配置Nginx。例如需要通过Https://a.example.com来访问端口为1000的服务,做如下配置即可:
server {
    listen 443 ssl;  修改
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  添加
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  添加

    server_name a.example.com; 你的域名

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://127.0.0.1:1000/; 你的服务地址:服务端口
    }
}

如果同时又希望通过 `https://b.example.com` 来访问另一个端口2000的服务,只需要按照上面的server模板再配一个server即可:

server {
    listen 443 ssl;  修改
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;  添加
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;  添加

    server_name b.example.com; 你的域名

    location / {
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_pass http://127.0.0.1:2000/; 你的服务地址:服务端口
    }
}

4.续约泛域名证书

手动续约

在我们第一次申请成功的时候,相关的参数会被保存到/etc/letsencrypt/renewal/dlice.xyz.conf,所以续约可以用一行代码搞定

`sudo certbot renew`

自动续约

编辑文件
vim /etc/crontab
或配置了crontab编辑器的情况下
crontab -e

 填入以下内容
1 1 23 */2 * sudo certbot renew --deploy-hook  "service nginx restart"
 注意只有成功renew证书,才会重新启动nginx