/ 技术笔记

免费SSL证书Let’s Encrypt在Centos安装 为你的Ghost博客添加 HTTPS

免费SSL证书Let’s Encrypt在Centos安装 为你的Ghost博客添加 HTTPS

经常看到受浏览器信赖的网站感觉很高大上,很想也把网站换上Https,但感觉年纪大了,不想折腾,拖延症也比较厉害,直到Google给我发了邮件,提示网站显示安全警告,建议我迁移到Https,所以不得不重视起来。

网上搜索关于免费SSL证书的,目前比较好的解决方案是使用Let’s Encrypt,适合个人使用,不用再忍受自签发证书不受浏览器信赖的提示。

Let's Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,证书有90天的有效期,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

搜索发现Let's Encrypt证书安装方法有很多,感觉使用最新发布的新工具certbot最为方便,虽然是新的工具,但是生成证书的使用方法和参数是基本一致的,证书续期更简单了。

目前certbot在一些老版本的Linux发行版上的兼容性还是有问题的,特别是在CentOS 5上因为python版本过低是无法用的,CentOS 6上需要先安装epel。那么好吧,根据下面安装配置来实现。

安装certbot

Centos 6

yum -y install git bc
yum install epel-release
cd /usr/bin
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
ln -s /usr/bin/certbot-auto /usr/bin/certbot

Centos 7

yum install epel-release
yum install certbot

为Ghost博客安装let’s Encrypt前做一些准备

在我们得到并执行Let's Encrypt之前,我们需要设置一个阶段。为了让我们加密验证我们拥有的域名,我们需要通过Nginx设置来进行验证。 我们需要编辑我们的Nginx下的ghost配置文件。
把原来的配置设置成:

server {
    listen 80;
    server_name www.sungz.com;
 
    location ~ ^/.well-known {
        root /var/www/ghost;
    }
     location / {
        proxy_set_header   Host      $http_host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_pass         http://127.0.0.1:2368;
    }
}

然后重启nginx.

获取let’s Encrypt SSL证书

  • 单域名生成证书:
./certbot-auto certonly --email youemail@sungz.com --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.sungz.com -d www.sungz.com
  • 多域名单目录生成单证书:(即一个网站多个域名使用同一个证书)
./certbot-auto certonly --email youemail@sungz.com --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.sungz.com -d www.sungz.com -d blog.sungz.com
  • 多域名多目录生成一个证书:(即一次生成多个域名的一个证书)
./certbot-auto certonly --email youemail@sungz.com --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.sungz.com -d www.sungz.com -d bbs.sungz.com -w /home/wwwroot/vuejsexamples.com -d vuejsexamples.com -d blog.vuejsexamples.com

提示

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.sungz.com/fullchain.pem. Your cert will
expire on 2017-10-01. To obtain a new or tweaked version of this
certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
"certbot-auto 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/www.sungz.com/ 目录下

配置nginx

server {
    listen      80;
    server_name www.sungz.com;

location ~ /.well-known {
        allow all;
}
    location / {
        return 301 https://$server_name$request_uri;
    }
}
 server {  
    listen       443;
    server_name www.sungz.com;
    ssl          on;
    ssl_certificate /etc/letsencrypt/live/www.sungz.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.sungz.com/privkey.pem;
    #    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384: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:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
 
    # enable HSTS including subdomains
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

location ~ /.well-known {
        allow all;
}
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

自动更新证书

由于获取的证书就三个月,我们可以用定时任务进行证书的更新:

crontab -e

CentOS 6.x

01 1 * * 0 /usr/bin/certbot renew >> /var/log/ssl-renew.log
06 1 * * 0 /sbin/service nginx reload

CentOS 7.x

01 1 * * 0 /usr/bin/certbot renew >> /var/log/ssl-renew.log 
06 1 * * 0 /usr/bin/systemctl nginx reload

每周天凌晨1点,执行certbot renew 命令,并且将日记写入 /var/log/ssl-renew.log