具体怎么操作本文不做详细说明,还有ssl原理,网上一大堆,都是抄来抄去。我说点实际操作过程中的一些细节和问题。

https其实和http一样,只是意味着在客户端和服务器之间传输的信息加了密。网站代码不需要做任何变动,只需要服务器导入证书,绑定https域名。

 

首先,第一个遇到的问题就是,全部部署完了,网站怎么也访问不了。。。后来发现是防火墙443端口没开,https需要用到443端口,顿时觉得自己好傻。防火墙有服务器的防火墙,还有云服务器的云防火墙等。

 

下面大概说一下流程。

先申请一个ssl要用到的CA证书。很多地方可以申请,小网站推荐阿里云的免费证书,具体申请流程自己看提示操作就行。

 

为什么要申请CA证书?

浏览器内置了一些机构,默认就在信任列表里,如果网站用的ssl证书是这些机构发的,那你的网站可以直接访问。

当然ssl证书你也可以自己生成,不通过那些机构,但是因为证书不是那些机构发行的,你的证书在浏览器看来就不在“信任”列表里,用户访问的时候浏览器会有提示,只有用户点击继续,或者把网站加入信任列表,才可以继续访问。相信这不是一个很好的体验吧?

有了ssl证书就把证书传到服务器上导入iis,在网站域名绑定的时候,绑定https的同时,选择你的证书。Windows环境下证书的扩展名是pfk,其他环境用的格式不一样。

其中iis有一个选项,SSL设置,一开始不知道啥意思,多次试验以后有以下结论:

1、如果勾选“要求SSL”,那么网站只能通过https的方式访问,http访问会显示没有权限;
2、勾选“要求SSL”以后,客户端证书点“忽略”,那么不会验证客户端是否有证书;

3、客户端证书点“接受”,那么会检测客户端有没有客户端证书,如果有则验证客户端证书;

4、客户端证书点“必须”,就会强制验证客户端证书,如果客户端没有证书也是不能访问的。


什么是客户端证书?

客户端证书是给用户装的,和前面申请的CA证书不一样。客户端证书需要在自己的服务器上生成。如果勾选了客户端证书的“必须”,那只有有证书的用户才能访问你的网站,是用来限定用户范围的。

 

一般情况下不需要勾选“要求SSL”,客户端证书保持忽略。

 

一台服务器上一般都运行有多个网站,如果多个网站都要https话怎么办?

因为用了ssl,传输过来的信息都是加密的,iis没有办法确定要访问的是哪一个网站,不知道用一张证书去解密信息。所以多个https网站默认都是用的同一张证书。如果要iis自动识别是要访问哪个网站,使用对应的证书,绑定域名的时候需要勾选“需要服务器名称指示”,英文缩写是“SNI”。这个功能在低版本的iis上没有。勾选以后,不同的网站可以绑定不同的证书。

 

什么是SNI(Server Name Indication)服务器名称指示?

简单的说就是浏览器额外发送一个不加密信息给服务器,告诉服务器要访问的是哪个域名,服务器收到信息以后就知道用哪张证书去解密收到的密文,这样一台服务器就可以多个https网站同时运行。

SNI并不是所有的浏览器都支持,所以iis还会要求你建一个默认网站,用来处理不带SNI信息的https访问。

 

紧接着我分析了一下CDN实现https的方式,毕竟CDN用的也比较多。CDN相当于一个代理服务器,在用户和服务器之间做了中间人。网站相对CDN是服务器,CDN相对用户是服务器。

模式一,用户只能用http方式访问,https会无法访问,CDN回源用http方式。

模式二,用户只能用http方式访问,https会无法访问,CDN回源用https方式。

模式三,用户只能用https方式访问,http方式会被CDN强制跳转到https,CDN回源用http方式。

模式四,用户只能用https方式访问,http方式会被CDN强制跳转到https,CDN回源用https方式。

模式五,用户http和https可以同时访问,CDN回源用http方式。

模式六,用户http和https可以同时访问,CDN回源用https方式。

模式七,用户http和https可以同时访问,若用户http访问,CDN回源用http方式,若用户https访问,CDN回源用https方式。

 

从http强制跳转到https,一种方式就是自己服务器上的网站来完成跳转,这种方式一般http整站redirect到https上。还有一种方式就是由CDN来完成跳转,这种方式只要在CDN控制台点个开关就能完成。

 

CDN可以强制从http跳转到https,但是阿里云的CDN明说了强制跳转的话,不会带上SNI信息。这就尴尬了。当你用了CDN,又要CDN强制跳转,服务器上又有多个网站要https化,会因为SNI的缺失出现问题。所以个人推荐服务器不要使用ssl,相当于使用模式三。

https因为加密的性质,会耗费一些时间来加解密。用户到CDN,加密解密一次,如果服务器也使用了https,那么CDN到服务器,又加密解密一次。用户的单次访问会实际造成2次加密解密,耗费的时间会增多,这也是我不推荐服务器使用ssl的另外一个原因。

我们使用https的初衷就是防止网页被篡改,而篡改的行为一般都发生在用户与CDN之间,往往是运营商dns劫持等等。小站完全可以假设CDN到服务器之间是彻底安全的。当然了,对安全要求更高的网站,全链路https化也是必要的。

 

这里有一点要注意,有一部分网站是用模版建站的,网站内的链接是绝对地址,绝对地址由模版自动生成。用http访问,网站内生成的链接都会以http开头,用https访问,生成的链接都会以https开头。这时候用模式三会出现一个bug(有的模版是相对地址,就不存在这个问题)。

用户用https方式访问,CDN回源把服务器返回的html信息传递给用户。因为服务器面向的访客其实是CDN而不是用户,CDN以http方式回源,模版返回的链接全都是http开头。最后的结果就是虽然用户是https方式访问,但是内部的链接的全是http开头。在网页引用的情况下,这些http链接属于资源,浏览器只会按原方式去解析资源,不会自动跳转到https,导致解析失败无法显示。浏览器redirect跳转操作只在地址栏直接输入地址的时候起效。CDN强制跳转的原理就是让浏览器访问的地址跳转。

举个例子,用https方式访问首页,里面有张图,发生bug以后,图片的地址是http开头的,图片属于资源,浏览器在解析网页的时候,只会用http这个链接去解析图片,CDN会返回强制跳转的信息(设置了强制跳转),浏览器在解析资源的时候无法回应跳转操作,最后导致图片无法显示。

 

https网站还有refer问题。

从https网站上点击链接跳转到http网站,浏览器不会自动带上refer信息,这样http网站就无法得知来源网站。http网站调用Request.UrlReferrer只会得到null。

 

 

就先说这么多吧,有问题可以留言或者到页面底部点开“关于我”,获取我的联系方式。

一条评论

发表评论

评论通过审核后才会显示
你的电子邮件地址不会被公开 * 为必填字段

Captcha Code

提交评论