LNMP自动更新的免费SSL证书

LNMP.org提供的Linux、Nginx、MySQL、PHP环境安装包是很多站长建立Web服务器的得力工具。1.4版的LNMP安装包包含了Letsencrypt提供的免费SSL证书申请工具,但是目前尚未正式发布(截至2017年2月)。如果你使用的是1.4版以上的LNMP环境,则可以在设置新站点时选择同时申请免费SSL证书,全程命令行交互,好不惬意。

话说回来,已经进入生产环境的服务器也很难全面升级LNMP环境包,顶多是单独升级PHP和MySQL的版本。那么1.4以下的LNMP如何在站点上启用Letsencrypt提供的免费SSL证书,并且能够自动升级呢?且看本文分解。

前言

什么是SSL证书?
SSL证书是一套为网站和用户提供加密通信的安全工具。简单来说,它是两个文本格式的秘钥文件。在服务器端正确设置了这两个文件之后,你的网址就可以由“http://”升级为“https://”。别看多了一个“s”,他人基本上就不能窥探网站和用户间传输的数据了。

什么是LetsEncrypt?
从前,SSL证书不是免费的(现在也不全是)。你需要每年向为你提供秘钥文件的机构支付一笔费用,少则数百,多则数万软妹币。后来,慢慢有了免费提供SSL证书的机构,但是这些机构颁发证书仍需要繁琐的审批流程。2016年,由CISCO、EFF(电子前线基金会)和Mozilla领衔赞助的免费证书机构Letencrypt正式上线了。从此,只需要简单验证域名的所有权,你就可以申请一份网站SSL证书。这一过程完全是实时的。

环境

– Debian (版本7.5以上) / Ubuntu (版本12.12以上)
– LNMP 一键安装包

安装CertBot

命令行,键入:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto

CertBot在验证服务器域名的时候,会生成一个随机文件,然后CertBot的服务器会通过HTTP访问你的这个文件,因此要确保你的Nginx配置好,以便可以访问到这个文件。

修改你的服务器配置(位于/usr/local/nginx/conf/vhost目录下,请编辑相应网站的配置文件),在“INCLUDE”一行下面添加:

location ^~ /.well-known/acme-challenge/
        { default_type "text/plain"; root /usr/local/nginx/html; }
location = /.well-known/acme-challenge/
        { return 404; }

接着重新加载Nginx配置:

lnmp nginx reload

然后在命令行输入:

certbot-auto certonly --webroot -w /usr/local/nginx/html/ -d a.domain.com -d b.domain.com -d c.domain.com

需要在一份证书中包含多个域名,则按照上述格式添加。但是至少需要“-d domain.com”包含一个域名。请注意,domain.com和www.domain.com不同的域名,申请时不要遗漏。

如果提示:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
 /etc/letsencrypt/live/your.domain.com/fullchain.pem. Your cert
 will expire on 20XX-09-23. To obtain a new or tweaked version of
 this certificate in the future, simply run certbot again. To
 non-interactively renew *all* of your certificates, run "certbot
 renew"
 - If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
 Donating to EFF: https://eff.org/donate-le

证书生成成功!

启用443端口

同样,修改Nginx的虚拟主机配置文件,新建一个443端口的server配置:

server {
 listen 443 ssl;
 listen [::]:443 ssl ipv6only=on;

ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem;
 ssl_trusted_certificate /etc/letsencrypt/live/your.domain.com/chain.pem;

// ... other settings ...
 }

上面记得替换your.domain.com为你自己的域名。

接着重新加载Nginx配置:

lnmp nginx reload

现在通过浏览器访问你的网站:https://your.domain.com试试,如果看到浏览器的绿色标志,恭喜你设置成功!

不过由于这个证书的时效只有90天,我们需要设置自动更新的功能,帮我们自动更新证书的时效。

自动更新证书

先在命令行模拟证书更新:

certbot-auto renew --dry-run

模拟更新成功的效果如下:
-------------------------------------------------------------------------------
 Processing /etc/letsencrypt/renewal/your.domain.com.conf
 -------------------------------------------------------------------------------
 ** DRY RUN: simulating 'certbot renew' close to cert expiry
 ** (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
 /etc/letsencrypt/live/your.domain.com/fullchain.pem (success)
 ** DRY RUN: simulating 'certbot renew' close to cert expiry
 ** (The test certificates above have not been saved.)

既然模拟成功,我们就使用crontab启用自动任务,命令行:

crontab -e

添加配置:

30 2 * * 1 /root/certbot-auto renew >> /root/letsencrypt-renew.log

上面的执行时间为:每周一半夜2点30分执行renew任务。

总结

一般情况,Certbot-Auto工具对Nginx进行认证时,需要关闭Nginx并启用Certbot-Auto的Standalone(独立服务器)模式,其实就是让Certbot-Auto替代Nginx接受“域名挑战”(确认你拥有指定域名的操作权)。这样,无论是申请证书还是更新证书,都十分麻烦,需要暂停正常的Web服务。

但是按照本文地设置方法,当Nginx收到域名挑战时,自动反馈其默认目录(/usr/local/nginx/html/)的内容,可以迅速完成“域名挑战”操作。无论是申请还是更新,都不会影响Nginx的正常运转。

主要参考:https://segmentfault.com/a/1190000005797776

发表评论