免费SSL证书制作-Lets Encrypt

腾讯云一年的免费SSL证书到期了,在老大的推荐下看了一下Let's Encrypt 家的免费证书,虽然只有三个月,但是支持免费续期,而且支持通配符证书,这倒是很大的福利了

首先声明,我的系统是CentOS7 ,系统不一致,可自行Google其他或直接官网教程https://certbot.eff.org/lets-encrypt/centosrhel7-nginx

下载certbot

1
2
$ wget https://dl.eff.org/certbot-auto
$ chmod +x certbot-auto

制作通配符证书

1
$ ./certbot-auto certonly  -d "*.example.com" -d "example.com"  --manual --preferred-challenges dns-01  --server https://acme-v02.api.letsencrypt.org/directory

这里会自动运行yum安装必要的包,然后会提示如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Please choose an account
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: dev_test@2016-04-18T23:21:19Z (911e)
2: ip-10-164-131-233.ap-southeast-1.compute.internal@2016-06-13T11:02:16Z (5c1b)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for example.com
dns-01 challenge for example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

注意这里

1
2
3
4
5
6
7
8
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

e35fqmCZcB8L56ID4801hlA3aLx3viXtZo1yA3WVSmg

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

需要在后台域名解析之后再按Enter

制作完成后,将制作后的证书拿过用即可

配置如下

1
2
3
ssl_certificate cert/fullchain1.pem;
ssl_certificate_key cert/privkey1.pem;
ssl_trusted_certificate cert/chain1.pem;

重启后就能看到HTTPS的安全绿色小球了

续期

上面提到了,这个证书有效期只有三个月,所以需要定时重新生成新的证书,然后完成后重启nginx

完整命令:certbot-auto renew [--cert-name CERTNAME] [options]
可选参数:

  • --cert-name CERTNAME:指定要更新的证书。Certbot 用这个名称来管理证书文件。名称不影响证书内容。可以用 certbot certificates 命令查看证书名。
  • --dry-run:用于测试,只获取测试证书,不保存至磁盘。只有 certonly 和 renew 两个子命令可以用这个参数。仍然会会改写 Apache 或 Nginx 服务器的配置文件并重启服务器。仍然会调用 --pre-hook--post-hook 命令(只要定义过)。只是不再调用 --deploy-hook 命令。
  • --force-renewal, --renew-by-default:强制更新域名的证书,即使离过期时间还远得很。
  • --allow-subset-of-names:在域名所有权认证时,即使认证失败,也产生证书。在更新多个域名时有效,因为有可能部分域名不再指向当前主机。注意:不能和参数 --csr 同时使用。
  • -q, --quiet:静默执行。
  • --debug-challenges:调试模式,提交至 CA 前需要用户确认。
  • --preferred-challenges:验证域名所有权的方式,”dns” 或 “tls-sni-01,http,dns” 等。每个服务器插件支持有限种类的方式。
  • --pre-hook PRE_HOOK:在获取证书前要执行的 shell 命令。比如暂时关闭服务器软件以防止可能的冲突。只有在自动获取/更新证书时才会执行。如果更新多个证书时,只执行第一个命令。
  • --post-hook POST_HOOK:在获取证书后要执行的 shell 命令。比如部署新证书,或重启服务器软件。如果更新多个证书时,只执行第一个命令。
  • --deploy-hook DEPLOY_HOOK:每个有效的认证都会触发一次的 shell 命令。对这个命令,shell 变量 $RENEWED_LINEAGE 表示包含域名证书和私钥的配置目录,比如 /etc/letsencrypt/live/example.com$RENEWED_DOMAINS 表示空格分隔的刚更新的域名列表,比如 example.com www.example.com
  • --disable-hook-validation:验证 --pre-hook/--post-hook/--deploy-hook 的 shell 命令是否有效,提前发现错误。
  • --no-directory-hooks:更新证书时不执行 hook 目录中的命令。

写个脚本加入到定时任务里面即可