Mozilla、思科、Akamai、IdenTrust、EFF和密歇根大学研究人员宣布了Let's Encrypt CA项目,为网站提供免费SSL证书,加速网站从HTTP升级到HTTPS的进程。最近开始了任何人都可以参加的公测,之前需要邀请码。现在将过程记录下来以供参考。
本站在使用香港沙田CN2主机过程中时常会发生signed.pem内容为空的情况,建议大家及时备份一下已签发证书并进行监控,以防证书更新不成功导致站点访问不正常的情况文章及代码都修改自:https://github.com/diafygi/acme-tiny
重要:不要使用国内的DNS解析,否则无法验证域名。截至2015年12月6日,已经验证不可用的:HiChina, DNSpod, Cloudxns via https://www.v2ex.com/t/230100,不排除这些运营商将来解决这个问题。我自己用dns.he.net的进行验证成功。
基本设置生成account.key, domain.key and dhparam.pem
# All codes modify from https://github.com/diafygi/acme-tiny # A base dir for everything,根目录 mkdir /var/ssl/yourdomain/ cd /var/ssl/yourdomain/ # Generate account.key, domain.key and dhparam.pem,生成account.key, domain.key and dhparam.pem三个文件 openssl genrsa 2048 > account.key openssl genrsa 2048 > domain.key openssl dhparam -out dhparam.pem 2048 # Generate domain.csr,生成domain.csr openssl req -new -sha256 -key domain.key -subj "/CN=www.yourdomain.com" > domain.csr
设置网站文件供脚本写入文件验证域名
我用的是Nginx作为前端,在文件中添加:
server { listen 80; server_name yoursite.com, www.yoursite.com; location /.well-known/acme-challenge/ { alias /var/www/yourdomain/; try_files $uri =404; } #The rest of your Nginx config,你其余的Nginx配置文件 }
获取acme-tiny脚本,自动进行注册账号,验证域名及签发证书
# Install git if you haven't,安装所需的git工具 apt-get install git # Clone acme-tiny,获取Let's Encrypt申请脚本 git clone https://github.com/diafygi/acme-tiny.git cd /var/ssl/yourdomain/acme-tiny/ # Register account, verify the domain and sign the certificate,自动进行注册账号,验证域名及签发证书 python acme_tiny.py --account-key /var/ssl/yourdomain/account.key --csr /var/ssl/yourdomain/domain.csr --acme-dir /var/www/yourdomain/ > /var/ssl/yourdomain/signed.crt # Get and combine the intermediate into chained.pem,获取并合并证书 cd /var/ssl/yourdomain/ wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem
设置网站文件添加SSL证书并启用HTTPS访问
server { listen 443; server_name yoursite.com, www.yoursite.com; ssl on; ssl_certificate /var/ssl/yourdomain/chained.pem; ssl_certificate_key /var/ssl/yourdomain/domain.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA; ssl_session_cache shared:SSL:50m; ssl_dhparam /var/ssl/yourdomain/dhparam.pem; ssl_prefer_server_ciphers on; #The rest of your Nginx config,你其余的Nginx配置文件 }
如果只需要443端口,那么就注释掉80端口的监听语句,并且用下面语句进行跳转
#For redirect to https,跳转到带证书的主域名 server { server_name yoursite.com, www.yoursite.com; rewrite ^(.*) https://www.yoursite.com$1 permanent; }
自动续期证书脚本
建立一个renew_cert.sh,其实就是上面步骤的命令合体。路径还是/var/ssl/yourdomain/
#!/usr/bin/sh cd /var/ssl/yourdomain/acme-tiny/ # Register account, verify the domain and sign the certificate,自动进行注册账号,验证域名及签发证书 python acme_tiny.py --account-key /var/ssl/yourdomain/account.key --csr /var/ssl/yourdomain/domain.csr --acme-dir /var/www/yourdomain/ > /var/ssl/yourdomain/signed.crt # Get and combine the intermediate into chained.pem,获取并合并证书 cd /var/ssl/yourdomain/ wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem service nginx reload
建立Cron任务:
# example line in your crontab (runs once per month) 0 0 1 * * bash /var/ssl/yourdomain/renew_cert.sh 2>> /var/log/acme_tiny.log # restart Nginx to load the new certificate 10 0 1 * * /etc/init.d/nginx restart
每月更新一次,续期脚本结果作为日志输出在/var/log/acme_tiny.log
权限及安全
原文章里作者提了安全及权限事项,大家一定要遵照。原文作者的建议是专门创建一个新用户,权限仅限于私钥,脚本及challenge文件夹。允许次用户写入存放网站证书的路径(本例中是/var/ssl/yourdomain/)和重启网页服务器(nginx)。
- 备份好私钥(e.g. account.key)
- 不要让这个脚本有读域名私钥的权限
- 不要用root权限来运行此脚本
参考资料
- acme-tiny:https://github.com/diafygi/acme-tiny
- Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程:https://s.how/nginx-ssl/
- JerryQu 关于HTTPS的系列:https://imququ.com/series.html
- 编译Nginx增加HTTP/2支持:https://shanjie.me/2015/10/15/升级Nginx-加入对HTTP2的支持/
- Nginx 开始支持 HTTP/2 了:https://imququ.com/post/nginx-http2-patch.html
启用HTTPS访问和HTTP/2的好处在于防止运营商劫持插入广告,加快网站载入速度。这是未来互联网的趋势,建议大家尽快部署。
10 thoughts on “Let's Encrypt证书快速申请并自动续期”
你好,我使用你站内的lnmp脚本搭的wp,签好let'sencrypt证书,修改wp的nginx配置文件添加了"listen443;ssl on;ssl_certificate /example;ssl_certificate_key /example;"这些字段,之后,就无法重启nginx了,想请教下还需要怎么做
啊,不好意思,已经搞定了~打扰了
如果方便,希望能多宣传一下,或者给小博个链接,谢谢
感觉这东西还是很不完善,我用国外的dns也没申请下来
申请的时候还得停止nginx运行
用这个脚本实测不需要暂停Nginx运行(只有200行代码没有任何依赖库),好像用客户端的时候要独占端口,但是客户端可以改非80端口。
既然暂时用不了就先不折腾了
建议还是折腾一下比较好,毕竟HTTP/2是将来的趋势,SSL证书则是必备品,可以防运营商广告劫持
大叔年纪大了。