在CentOS中通过Certbot自动部署Let’s encrypt的免费SSL证书

aries 发表于 2017-04-20 2986 次浏览 标签 : centoshttps

配置 Nginx 加入证书letsencrypt是一个免费ssl提供商。证书有效期3个月,每3个月需要renew证书一次。下面的教程介绍了如何安装配置证书,及如何通过cron自动renew证书.

本教程基于CentOS/RHEL 6系统,Web服务器是Nginx。其他服务器教程可以参考Certbot官网

安装Certbot
环境准备
因为Certbot的很多依赖并不在系统默认Repo中,需要先安装EPEL Repo。
同时为了防止组件过旧导致的报错,建议运行一次 yum update 。

yum install epel-release
yum update

Python升级(可选)
CentOS6默认安装的Python是2.6版本,这个在Certbot运行的时候会有一个警告。

DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python.

其实这不影响Certbot的运行,但是如果觉得看到这个警告不爽的,可以将Python升级到2.7来解决。如何升级?看这里

下载安装Certbot
因为并没有针对CentOS6的预编译安装包,因此需要通过certbot-auto脚本来获得Certbot。

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

cerbot-auto的运行参数同certbot完全相同,运行后会自动安装certbot相关依赖并自动更新:

/usr/bin/certbot-auto certonly

注意:cerbot-auto会自动下载最新版并进行安装,如果你希望使用某一特定版本并禁止自动更新的话,请在运行时加上 --no-self-upgrade 参数。
另外,如果你对脚本自动从网上下载内容更新有安全顾虑的话,请参考官方关于这个问题的建议。

生成证书
Certbot本身支持通过plugin插件的方式进行安装部署证书,但是由于CentOS下目前还不支持自动安装,我们需要手动生成证书。

/usr/bin/certbot-auto certonly

这个命令可以让你以交互的方式来自己选择插件及选项生成证书。
如果你已经有自己的Web服务器了,建议选择 webroot 插件。

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

location ^~ /.well-known/acme-challenge/ {
   default_type "text/plain";
   root /home/wwwroot/public;

}
location = /.well-known/acme-challenge/ {
   return 404;
}

特别注意:
目前版本(0.8.0)的Cerbot交互式生成证书方式有一个bug,当通过交互方式选择 webroot 生成证书的时候, webroot-path 不会保存在renewal的config文件中,导致证书更新的时候会因为config配置文件不全而发生错误无法更新。针对这种情况应该使用命令行指定参数的方式来进行证书生成:

/usr/bin/certbot-auto certonly --webroot -w /home/wwwroot/public/ -d blog.iw3c.com -d www.iw3c.com -d iw3c.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

就说明证书生成成功,相关的证书会生成面如下目录:

/etc/letsencrypt/live/iw3c.com/

自动更新证书

因为Let’s Encrypt证书的有效期只有90天,因此让其自动更新证书就变得势在必行了。
我们先通过下面的命令来验证自动更新:

/usr/bin/certbot-auto renew --dry-run

如果结果显示更新正常,那就可以将下列命令加入到cron或systemd中自动运行。

**注意:**如果选择通过cron或者systemd来自动续期,官方建议让其每两天运行一次。
官方解释说这么做是为了防止因为种种原因导致的证书失效问题。不用担心证书频繁更新的问题,因为除非你的证书快到期或者失效了,否则脚本并不会做任何事情。运行的时刻随机制定一个即可。

crontab -e
0 2 */2 * *  /usr/bin/certbot-auto renew --quiet  #间隔两天,凌晨2点执行

更新Nginx配置

进行如下操作:

vim /usr/local/nginx/conf/iw3c.conf
#修改原有配置
listen 443 ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/iw3c.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/iw3c.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/iw3c.com/chain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
#listen 80;
#listen [::]:80;
#加入
server {
        listen 80;
        server_name  blog.iw3c.com  iw3c.com ;
        return 301 https://$host$request_uri;
}

重启Nginx,完成!

0条评论

如需评论,请填写表单。
换一个

记住我的信息