Certbot 签发 Let's Encrypt Https证书,并自动更新

先描述一下我的场景

解析的域名

主域名,解析目录在/mnt/www/iluoy.com/public iluoy.com

www域名 跳转到主域名 www.iluoy.com

游戏测试接口,解析在 /mnt/www/game game.iluoy.com

代码库, nginx转发 gitlab.iluoy.com

我的目的是这些域名我都用一本证书...好了 那我们开始吧

安装 Certbot

安装依赖和certbot

sudo yum install epel-release
yum install certbot

签发证书

新建专门用于验证的文件夹

这里我新建了一个文件夹verify,专门用于验证https的文件夹

mkdir /mnt/www/verify

生成证书

使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos

注意:联系人email地址要填写真实有效的,letsencrypt会在证书在过期以前发送预告的通知邮件

sudo certbot certonly --webroot -w /mnt/www/verify -d iluoy.com -d www.iluoy.com -d gitlab.iluoy.com -d game.iluoy.com -m 3211028@qq.com --agree-tos

私人备份

sudo certbot certonly --webroot -w /mnt/www/verify -d idea.iluoy.com -d sentry.iluoy.com -d logs.iluoy.com -d game.iluoy.com -d gitlab.iluoy.com -d iluoy.com -d test.iluoy.com -d www.iluoy.com -d api-blog.iluoy.com -d lq.iluoy.com -d 156cv.iluoy.com -m 3211028@qq.com --agree-tos

申请成功的提示

file

遇到的错误

ImportError: No module named 'requests.packages.urllib3'

file

pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3

stackoverflow

Collecting requests==2.6.0
  Downloading http://mirrors.aliyun.com/pypi/packages/73/63/b0729be549494a3e31316437053bc4e0a8bb71a07a6ee6059434b8f1cd5f/requests-2.6.0-py2.py3-none-any.whl (469kB)
    100% |████████████████████████████████| 471kB 26.6MB/s
Collecting urllib3
  Downloading http://mirrors.aliyun.com/pypi/packages/63/cb/6965947c13a94236f6d4b8223e21beb4d576dc72e8130bd7880f600839b8/urllib3-1.22-py2.py3-none-any.whl (132kB)
    100% |████████████████████████████████| 133kB 35.8MB/s
Installing collected packages: requests, urllib3
  Found existing installation: requests 2.18.4
    Uninstalling requests-2.18.4:
      Successfully uninstalled requests-2.18.4
  Found existing installation: urllib3 1.22
    Uninstalling urllib3-1.22:
      Successfully uninstalled urllib3-1.22
Successfully installed requests-2.6.0 urllib3-1.22

ImportError: No module named requests

# 都说用下面的命令能解决,但是 我没有解决
sudo pip install requests

执行完后出现了,结果还是报错ImportError: No module named requests

Requirement already satisfied: requests in /usr/lib/python2.7/site-packages

于是就更新了,还真行...🤣 🤣 🤣 🤣

sudo pip install requests --upgrade

ImportError: cannot import name UnrewindableBodyError

pip uninstall urllib3
pip install urllib3
sudo pip install urllib3 --upgrade

削微寒的程序员之路

ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.4.1708/cloud/x86_64/openstack-newton/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm

这里是pyOpenssl的源 自己调一个可用的

sudo: certbot:找不到命令

奇怪的是等我装完pyOpenssl后certbot没了..没了..居然没了

yum install certbot

与知blog

如果出现以下文字,那就说明你要生成的域名没有解析到目录下去.自己nginx解析去...

To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.

部署nginx

配置各自域名的正确root路径和证书

ssl_certificate    /etc/letsencrypt/live/iluoy.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/iluoy.com/privkey.pem;

配置自动续命,因为证书只有90天有效期啊

大家还记得,我之前生成了一个verify的目录吧(为了生成证书用),但其实,我项目的解析目录都不在verify下面.

执行以下更新证书命令

其他命令

查看证书有效期

openssl x509 -noout -dates -in /etc/letsencrypt/live/iluoy.com/cert.pem
notBefore=Jan 20 05:04:33 2018 GMT
notAfter=Apr 20 05:04:33 2018 GMT

更新证书

如果你的证书已经是过期的,那么是无法更新的...

certbot renew --dry-run
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

签发泛域名证书[阿里云]

为了签发这个证书啊,,我特意把域名从西数转出到阿里云 😌

安装依赖

yum update && yum install curl -y && yum install cron -y && yum install socat -y

安装acme.sh

curl https://get.acme.sh | sh
.....
[2018年 08月 15日 星期三 03:36:28 CST] Installing cron job
27 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

获得阿里云的Access Key ID和Access Key Secret传送门

这是环境变量(dns_ali)

export Ali_Key="你的Access Key ID"
export Ali_Secret="你的 Access Key Secret"

godaddy(dns_gd)keys

export GD_Key=""
export GD_Secret=""

申请证书

注意:第一个 -d 后不可直接写通配符域名.domain.com,一定要写个单域名,第二个 -d 后面可以写泛域名。

否则可能会出现签发的证书无法被信任的情况。

sudo /home/server/.acme.sh/acme.sh --issue --dns dns_ali -d iluoy.com -d '*.iluoy.com'
[2018年 08月 15日 星期三 03:37:51 CST] Registering account
[2018年 08月 15日 星期三 03:37:53 CST] Registered
[2018年 08月 15日 星期三 03:37:53 CST] ACCOUNT_THUMBPRINT='xxxxxxxxx'
[2018年 08月 15日 星期三 03:37:53 CST] Creating domain key
[2018年 08月 15日 星期三 03:37:53 CST] The domain key is here: /root/.acme.sh/iluoy.com/iluoy.com.key
[2018年 08月 15日 星期三 03:37:53 CST] Multi domain='DNS:iluoy.com,DNS:*.iluoy.com'
[2018年 08月 15日 星期三 03:37:53 CST] Getting domain auth token for each domain
[2018年 08月 15日 星期三 03:37:55 CST] Getting webroot for domain='iluoy.com'
[2018年 08月 15日 星期三 03:37:55 CST] Getting webroot for domain='*.iluoy.com'
[2018年 08月 15日 星期三 03:37:55 CST] Found domain api file: /root/.acme.sh/dnsapi/dns_ali.sh
[2018年 08月 15日 星期三 03:37:57 CST] Found domain api file: /root/.acme.sh/dnsapi/dns_ali.sh
[2018年 08月 15日 星期三 03:37:59 CST] Sleep 120 seconds for the txt records to take effect
[2018年 08月 15日 星期三 03:40:00 CST] Verifying:iluoy.com
[2018年 08月 15日 星期三 03:40:03 CST] Success
[2018年 08月 15日 星期三 03:40:03 CST] Verifying:*.iluoy.com
[2018年 08月 15日 星期三 03:40:07 CST] Success
[2018年 08月 15日 星期三 03:40:07 CST] Removing DNS records.
[2018年 08月 15日 星期三 03:40:24 CST] Verify finished, start to sign.
[2018年 08月 15日 星期三 03:40:26 CST] Cert success.
-----BEGIN CERTIFICATE-----
这里是秘钥
-----END CERTIFICATE-----
[2018年 08月 15日 星期三 03:40:26 CST] Your cert is in  /root/.acme.sh/iluoy.com/iluoy.com.cer
[2018年 08月 15日 星期三 03:40:26 CST] Your cert key is in  /root/.acme.sh/iluoy.com/iluoy.com.key
[2018年 08月 15日 星期三 03:40:26 CST] The intermediate CA cert is in  /root/.acme.sh/iluoy.com/ca.cer
[2018年 08月 15日 星期三 03:40:26 CST] And the full chain certs is there:  /root/.acme.sh/iluoy.com/fullchain.cer

证书安装的webserver

cd ~/.acme.sh

mkdir -p /etc/nginx/ssl/iluoy.com

sudo /home/server/.acme.sh/acme.sh  --install-cert  -d  iluoy.com   \
--key-file   /etc/nginx/ssl/iluoy.com/iluoy.com.key \
--fullchain-file /etc/nginx/ssl/iluoy.com/iluoy.com.cer \
--reloadcmd  "service nginx force-reload"
[2018年 08月 15日 星期三 03:53:38 CST] Installing key to:/etc/nginx/ssl/iluoy.com/iluoy.com.key
[2018年 08月 15日 星期三 03:53:38 CST] Installing full chain to:/etc/nginx/ssl/iluoy.com/iluoy.com.cer
[2018年 08月 15日 星期三 03:53:38 CST] Run reload cmd: service nginx force-reload
Redirecting to /bin/systemctl force-reload nginx.service
[2018年 08月 15日 星期三 03:53:38 CST] Reload success

域名自动续签

因为只有三个月,所以需要自动去续签

查看证书有效期

openssl x509 -in iluoy.com.cer -noout -dates
notBefore=Nov 13 07:20:19 2018 GMT
notAfter=Feb 11 07:20:19 2019 GMT

Error add txt for domain:_acme-challenge.iluoy.com

这说明你之前签发过证书,所以你需要删掉 ~/.acme.sh/iluoy.com

参考文献

certbot官网

diamondfsd.com

andylau00j csdn

laravel-china

使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书

HTTPS 安全最佳实践~HTTPS安全与兼容性配置指南

使用 acme.sh 签发续签 Let‘s Encrypt 证书