zvv

基于阿里云上实现全站https的正确姿势(二)

上一篇文章当中, 我们介绍了SSL证书的类型, 如何选择和购买等. 本篇文章我们开始进入实践环节, 讨论如何部署SSL证书.

我们应用程序的整体架构:


上述架构只列出了和讨论https相关的部分.

SSL证书放在哪里进行管理?


对于静态资源请求, 由于存储在阿里云OSS上, 并在最前端使用了阿里云CDN, 因此将SSL证书的相关信息在阿里云CDN上配置一下就好了.

对于动态资源的请求, 最前端是使用SLB, 理论上来说, 处理方式可以和上述CDN的方式保持一致, 即将SSL证书放在SLB上进行管理, 但是这样做有以下的缺点:

1

2

3

4

5
server {

listen 80;

server_name .example.com;

return 301 https://$host$request_uri;

}

同时, nginx还可以很方便做很多扩展功能, 例如http/2的支持, TCP优化等.

基于上述原因, 我们决定在SLB背后的web server上部署nginx, 并将SSL证书放在nginx上进行管理.

调整之后的架构如下:

Q: 上述架构中nginx是否会有单点失败的问题?
A: 不会, 基于成本的考虑, 我们并没有在使用单独的ECS Server部署nginx, 而是将nginx直接部署到了原来的那2台web server上, SLB上的健康检查也调整为check对应的nginx端口是否alive. 具体的设置方式会在下文当中进行介绍.

实践环节


接下来我们会阿里云CDN配置, nginx编译/部署/配置, 阿里云SLB配置, 以及相关的应用程序改动等方面, 逐一讲解完整的https部署过程.

Step 1: 从阿里云portal上下载SSL证书.

这里下载的是for nginx格式的证书. 原因是由于在阿里云CDN设置证书时需要使用, 此外我们会使用nginx来管理SSL证书.

下载解压了之后, 会得到2个文件:
xxx.pem
xxx.key

关于证书的编码格式和不同的扩展名, 请参考这里

Step 2: 在阿里云CDN上设置开启https支持.

Step 3: 源代码编译部署nginx.

内容较多, 参考这里

Step 4: 调整阿里云SLB的监听设置.

上一个步骤中, 我们已经部署好了nginx, 接下来需要调整SLB, 将原有SLB的监听端口由访问后端web application调整为访问nginx.

在阿里云后台portal中, 添加SLB监听设置: SLB TCP:443 –> Nginx TCP:443

设置SLB的健康检查:

NOTE:

  1. 原有SLB http:80 –> backend server http:port 的监听在完全切换为https之前建议保留, 以确保应用程序的兼容性.
  2. 完整切换完成之后, 将SLB http:80的监听调整为: SLB TCP:80 –> backend server tcp:443(即nginx的端口)

Step 5: 修改代码中内部以及第三方访问资源.

正如前文提到的, 由于浏览器的Mixed Content规范, 我们需要将application当中的使用到的内部访问URL以及第三方组件, 调整为使用https协议进行访问.

在升级的过程当中, 我们难免会出现遗漏的地方, 有两种方式来解决这个问题:

  1. 加载资源时, 去掉显式指定访问协议的部分, 这样浏览器就能根据主页面协议类型来自动选择HTTP/HTTPS资源 例如:


    1

    2

    3

    4

    5
    <img src="http://static.example.com/banner.jpg" />

     

    # 调整为:

     

    <img src="//static.example.com/banner.jpg" />
  2. 针对于现代浏览器, 可以通过upgrade-insecure-requests这个CSP 指令, 强制让页面上所有的http访问转换为https访问, 设置方式参考这里

下面我们列出一些在升级第三方组件的过程当中, 踩过的一些“坑”:

百度地图javascript api.

按照百度地图javascript api的官方文档, 只有javascript V2.0版本才支持https, 参考下图:

对于javascript API, 比较关键的是添加query string: s=1, 参考这里

1
https://api.map.baidu.com/api?v=2.0&ak=你的密钥&s=1

我们在将原有程序使用V1.4版本升级到V2.0的过程当中, 还发现了api的不兼容问题, 最后调整了代码才解决这个问题:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
var local = new BMap.LocalSearch(map, {

onSearchComplete: function (rs){

searchResult = rs;

}

});

 

function bindTraffic(){

var html = [];

var str = buildTemplate(searchResult[0]);

if (str != "") {

// your code logic here

}

}

 

function buildTemplate(ud, tmpl){

var context = {

title: ud.keyword,

items: []

};

 

$.each(ud, function (index1, u){

//u对象下V1.4版本的属性名叫ki, V2.0版本调整为了wr

$.each(u.wr, function (index2, ki){

// your code logic here

})

});

}

CNZZ (用于网站的数据收集统计,类似于GA或百度统计)

不需要升级, 官方的js脚本已经考虑了https的使用场景.

OneAPM (用于网站性能监控和统计)

不需要升级, 官方的js脚本已经考虑了https的使用场景.

百度站长统计

js代码需要调整为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
<script type="text/javascript">

(function(){

var bp = document.createElement('script');

bp.src = '//push.zhanzhang.baidu.com/push.js';

var curProtocol = window.location.protocol.split(':')[0];

if (curProtocol === 'https') {

bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';

}

else {

bp.src = 'http://push.zhanzhang.baidu.com/push.js';

}

var s = document.getElementsByTagName("script")[0];

s.parentNode.insertBefore(bp, s);

})();

</script>

对网站进行https测试.


使用SSL Lab’s进行评测

访问https://www.ssllabs.com/ssltest/index.html, 以下是我们按照上述方式调整之后的得分:

使用HTTP Security Report进行评测

访问https://httpsecurityreport.com/, 以下是我们按照上述方式调整之后的得分:

得分并不高, 剩下的几个点需要参考HTTP Security Best Practice继续优化.

 

via。http://www.zhuxiaodong.net/2016/how-to-switch-your-website-to-https-on-aliyun-part2/

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »

因本文不是用Markdown格式的编辑器书写的,转换的页面可能不符合AMP标准。