使用Certbot申请泛域名SSL证书(LetsEncrypt)
写在前面
(欢迎访问我的个人博客,获得更好的阅读体验)
在开始本篇教程之前,你需要:
- 确保域名成功解析到服务器ip,并确保你的服务器80端口没有被占用。
- 你可能需要到服务器控制台检查80和443端口是否开放。
- 本篇教程使用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
- 配置
- domain.ini:使用vim编辑器打开,检查默认域名信息,若没有自己的根域名需要自行添加。
- au.sh :登录控制台获取API秘钥,然后配置在该文件的相应位置。
- 申请证书 首先我们来验证一下工具是否可以正常执行:
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"
- 配置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