Nginx开启SSL与重定向优化

SSL已经不是什么新鲜东西了,早在前几个月就有消息称,Chrome将逐渐把所有的HTTP网站标记为“不安全”的红色警告。虽说此博客为全静态,且不涉及到密码登录与支付相关页面服务,但是小绿锁对于爱折腾的我的诱惑还是挺大的。这里记录了Nginx下开启SSL的过程与优化。

申请证书

本站用的是腾讯云申请的由亚洲诚信免费提供的DV SSL证书,有效期一年。网上有很多证书的获得方式,这里不再赘述(七牛云、阿里云等均有免费SSL证书提供申请)
腾讯云免费SSL证书
申请后会得到2个文件,一个.crt后缀、一个.key后缀。这里我们将它们上传到nginx目录下。

修改配置

登录服务器,输入

1
nginx -V

查看输出中是否包含http_ssl,如果没有,请参考此文

打开该站点的.conf文件,修改server块如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
#新增监听443端口,并指定443为ssl:
listen 443 ssl;
server_name www.iots.vip;

#ssl配置
ssl_certificate xxx.crt; #证书公钥文件路径(替换为自己的证书路径与文件名)
ssl_certificate_key xxx.key; #证书私钥文件路径(替换为自己的证书路径与与文件名)
ssl_session_timeout 5m; #5分钟session会话保持
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
#ssl配置

location / {
#其他规则保持不变
}
}

保存退出,执行nginx -t,提示success,则执行nginx -s reload

部分优化

我们需要对http做跳转到https

添加一个server模块,监听80端口请求:

1
2
3
4
5
6
#301跳转
server {
listen 80;
server_name www.iots.vip iots.vip;
return 301 https://www.iots.vip$request_uri;
}

部分还有http的页面会被提示不安全

  • 我们只需要将页面内非https资源去除即可(或者将其转为https)
  • 旧版的腾讯公益404页面调用的js是不支持https的,这里可以替换为新版的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
title: 404错误|Alliot's blog
layout: false <!--设置标题,同时取消layout-->
---
<!DOCTYPE HTML>
<html>
<head>
<title>404错误|Alliot's blog</title>
<meta name="description" content="404错误,页面不存在!">
<meta http-equiv="content-type" content="text/html;charset=utf-8;">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="robots" content="all">
<meta name="robots" content="index,follow">
</head>
<body>
<script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js" charset="utf-8" homePageUrl="https://www.iots.vip" homePageName="回到我的博客"></script>
</body>
</html>

遗留问题
之前以为配置错误,原来是因为缓存的原因。

考虑到SEO的因素(强迫症),我想做到一篇文章只有唯一的URL,即不管访问 https://iots.vip 还是 http://iots.vip 亦或者是 http://www.iots.vip ,均301自动跳转到https://www.iots.vip , 也就是说 https://www.iots.vip 作为唯一的访问Url。
我想直接通过两次的301达到这个目的:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name www.iots.vip iots.vip;
return 301 https://www.iots.vip$request_uri;
}
server {
listen 443;
server_name iots.vip;
return 301 https://www.iots.vip$request_uri;
}

上面的空格必须要,不能丢。因为nginx语法检测特别严格,if和后面括号以及变量等号这些元素都要有空格。

证书更新

2017年9月18日更新:
  今天发现访问博客的时候,提示SSL证书不受保护,意味着证书到期了。 这里我们需要更新一下证书:
更新证书很简单,分如下三步:

重新申请证书

  再次申请一个证书,下载,上传并覆盖之前的旧文件(存放位置见上文)。

重启web服务器

  覆盖旧文件后,还未生效,我们需要重启web服务器。
Nginx直接执行:

1
nginx -s reload  

Apache执行:

1
service httpd reload  

部署CDN证书

  (未开启CDN中HTTPS功能的请忽略此步)我们完成以上两步后,还需要在CDN控制台更新我们的证书文件,腾讯云请直接选择:域名-管理-高级配置-部署已有证书
  这样整个更新步骤完成,小绿锁又回来了。