全站启用HTTPS

关于启用https原本早就应该实施,只是由于服务器一直不固定的原因,也就推迟了下来。前一段时间赶上京东云打1折,就买了一台,顺便把博客就挪了过来。就在昨天历时半个多月的备案也下来了,整个过程比较顺利,至此整个博客就算迁移成功了,在此记录一下启用HTTPS的方法。

本站采用的是Let’s Encrypt免费证书,安装过程比较简单:

配置nginx配置文件

1
2
3
4
5
server {
server_name www.fcwalkers.com fcwalkers.com blog.fcwalkers.com;

...省略
}

注意server_name配上你想要配置的域名,否则certbot不会检查nginx配置文件并自动配置。

选择服务器系统

打开Certbot网站,选择使用软件以及服务器系统,此处以nginx和centOS7为例:

  • 安装相关依赖
1
2
$ yum -y install yum-utils
$ yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
  • 安装Certbot工具
1
$ sudo yum install python2-certbot-nginx
  • 生成证书
1
sudo certbot --nginx

如果是第一次安装会提示输入邮箱为了接收过期等信息,如果前面server_name配置了域名此时就会让你选择给那个域名配置证书(多个域名空格分割),否则直接生成证书。

至此https就配置完成了,打开nginx配置文件会发现多了如下配置:

1
2
3
4
5
6
7
8
server {
# https配置
listen 443 ssl http2; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/www.fcwalkers.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.fcwalkers.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

注意上面http2是开启http2协议,具有更快的HTTPS传输性能,所以建议开启(默认不开启)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
# http 301重定向
if ($host = www.fcwalkers.com) {
return 301 https://$host$request_uri;
} # managed by Certbot


if ($host = blog.fcwalkers.com) {
return 301 https://$host$request_uri;
} # managed by Certbot


if ($host = fcwalkers.com) {
return 301 https://$host$request_uri;
} # managed by Certbot

listen 80;
}

上面301重定向也可采用通用配置:

1
2
3
4
# Redirect non-https traffic to https
if ($scheme != "https") {
  return 301 https://$host$request_uri;
} # managed by Certbot

证书更新

Let’s Encrypt 证书的有效期是90天,因此需要设置自动化脚本定期更新证书。

使用crond服务定时执行更新操作,执行crontab -e命令,将下面内容复制后保存退出:

1
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

更多crond服务说明参考例行性工作调度笔记。

配置完后重启nginx 执行nginx -s reload即可。

其它问题

  • Mixed Content

    站点启用https后原有引用http的链接都会报错

    Mixed Content: The page at ‘https://xifengxx.github.io/web-demo/imooc/index.html' was loaded over HTTPS, but requested an insecure resource ‘http://player.youku.com/embed/XMTU4MTY4OTg5Mg=='. This request has been blocked; the content must be served over HTTPS.

    大致意思就是页面中混合使用了https和http链接,解决方法就是在页面的head中添加一个meta:

    1
    <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">