免费证书实现 https(保姆级教程)

使用 Certbot

Certbot 使用的是Let’s Encrypt的证书,该组织也强烈建议使用Certbot获取证书。

Certbot 配置

使用这个的目的是获取通配符证书,也就是支持二级域的证书验证,避免 https 错误的预警。

  • 主机商: 阿里云
  • 系统版本: Ubuntu18.04
  • Web 服务: nginx
  • 使用环境: python3

在 Certbot

进入Certbot选择 Web 服务和系统

957bea1493044dcf94f20f26dcef5c70_20190801231928.png

上图我选的是在 Ubuntu18.04 上面跑的 nginx。下面的提示就是你使用证书实现 https 之前需要有一个正常运行的网站,并且得有 sudo 的权限 (直接云服务器实例,轻量应用服务器之类的就可以了)

81a1c9fb281b4dcba1847e0572223b91_20190801232653.png

可以选择 默认 (Default)通配符 (wildcard)

默认的就是一张单域名的证书 (我用的是通配符的,直接通配符的可以跳过这一节)

  1. SSH 连接

  2. 添加 Certbot PPA 到库 (阿里云 root 下不需要 sudo 就直接可以的,下同)

    apt update
    apt install software-properties-common
    add-apt-repository universe
    add-apt-repository ppa:certbot/certbot
    apt-get update
    
  3. 下载 Certbot

    apt install certbot python-certbot-nginx
    
  4. 选择使用一种方式 (推荐使用手动!!)

自动:使用 Certbot 下载证书并且更新你的 nginx 设置

certbot --nginx

手动:只下载证书,手动配置 / 重启 / 重载 nginx(手动配置 nginx 需要对 nginx 有一定的了解,下面的参考文章里有阿里云 ssl 配置的参考)

certbot certonly --nginx
# 主要区别就在于certonly这个参数,通配符咱们也会遇到

证书成功生成之后会有信息显示证书所在的位置的,或者运行下面的命令查看证书,然后配置 nginx 的 ssl_certificate 和 ssl_certificate_key 这两个参数就好了。其中 privkey.pem 对应的就是 ssl_certificate_key 的目标文件。

 certbot certificates
  1. 测试自动更新

    Certbot 支持自动更新证书,然后自动添加了定时任务,就不需要手动更新证书了。官网说在 /etc/crontab、/etc/cron.*/* 或者 systemctl list-timers 里面使用了,不放心的可以手动添加定时任务并且设置重启 nginx 的。

    certbot renew --dry-run
    # --dry-run这个参数用于测试的
    
  2. 查看的网站的状态

这个要看具体的配置,80 端口开启 ssl 直接就好了,443 端口 https 访问!

通配符证书

  1. 检查 DNS 服务商是否被支持(国内的就不用看了)

  2. SSH 连接

  3. 添加 Certbot PPA 到库 (阿里云 root 下不需要 sudo 就直接可以的,下同)

    apt update
    apt install software-properties-common
    add-apt-repository universe
    add-apt-repository ppa:certbot/certbot
    apt-get update
    
  4. 下载 Certbot

    apt install certbot python-certbot-nginx
    
  5. 下载正确的插件 (国内的,从这一步开始咱们就可以下一章了!)

通配符插件国内主机如何解决之使用 certbot-letencrypt-wildcardcertificates-alydns-au

Certbot 官方有给出插件的编写的方法,也有提供第三方的插件 (有兴趣自行去了解)。国内有大佬自己写了插件,在此使用的是certbot-letencrypt-wildcardcertificates-alydns-au,文档比较友好,并且 issues 的回复也很快。

特别提醒: 下面官方的使用参考文档中的所有./certbot-auto 命令不再支持!请使用直接使用 certbot! 下面是基于 aliyun+python+nginx 的演示,具体流程和参数说明请直接参考官方文档!!

下载到 /var 下

cd /var
git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
cd certbot-letencrypt-wildcardcertificates-alydns-au
chmod 0777 au.sh

配置 domain.ini

cat domain.ini
# 如果有自己域名后缀的话就不用执行下面修改了
nano domain.ini

获取阿里云的 accesskey(腾讯云请参考官方文档)

参考 阿里云 API Key 和 Secret 的申请

修改 au.sh 参数

nano au.sh
# 填写下面两个参数
ALY_KEY=""
ALY_TOKEN=""
# 命令行路径可以修改,/usr/bin/python可以改为/usr/bin/python3,不过作者已经对python2、3都进行了适配

申请证书 (nginx+python)

测试配置

certbot certonly  -d *.example.com --manual --preferred-challenges dns --dry-run  --manual-auth-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"
# 一个顶级域名获取通配符证书直接修改*.example.com为自己的就好了,上述命令去掉--dry-run参数
# 以baidu.com举例(python)

certbot certonly  -d *.baidu.com --manual --preferred-challenges dns --manual-auth-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"

SAN 通配符证书 (直接添加 -d 和域名就好了)

# 基于官方示例(python)
certbot certonly  -d *.example.com -d *.example.org -d www.example.cn --manual --preferred-challenges dns --manual-auth-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"

配置 nginx

上面包括下面的所有命令都带 certonly,因此所有的操作都是只做认证,nginx 需要自行修改配置!!

证书成功生成之后会有信息显示证书所在的位置的,或者运行下面的命令查看证书,然后配置 nginx 的 ssl_certificate 和 ssl_certificate_key 这两个参数就好了。其中 privkey.pem 对应的就是 ssl_certificate_key 的目标文件。

如果不知道证书的位置,可以使用下面的命令查看

certbot certificates

配置完成之后

service nginx restart

证书的续期

请直接参考官方文档,下面贴出来的只是基于官方文档的 阿里云 +python 版 shell,官方演示 shell 使用的都是 php 和阿里云!!

# 所有证书renew
certbot renew  --manual --preferred-challenges dns --manual-auth-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"

# 某一张证书续期
# 查看证书
certbot certificates

# 记住证书名,比如simplehttps.com
certbot renew --cert-name simplehttps.com  --manual-auth-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"

加入 crontab

因为我使用了 nginx,所以添加 crontab 就直接 renew 成功之后重启 nginx 了。这里强烈建议 service nginx restart 重启!nginx -s reload 重载 nginx.conf 配置时并不一定会报错而带来影响 debug 的问题。

nano /etc/crontab

添加内容

1 1 */1 * * root certbot-auto renew --manual --preferred-challenges dns --deploy-hook  "service nginx restart" --manual-auth-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly add" --manual-cleanup-hook "/var/certbot-letencrypt-wildcardcertificates-alydns-au/au.sh python aly clean"

然后,就结束了!!

参考文章

我的博客 https://herberthe.github.io