2018 年 12 月 - 1 文章

还给用户一个干净整洁的上网环境,HTTPS协议的原理与应用

  |   0 评论   |   95 浏览

〇、为什么网站要使用HTTPS

这就要从ISP运营商的HTTP劫持说起了,利益让人铤而走险,广告的利益还真不小,某房产门户网站上一个广告位少则几千,多则几万。

我们身边无处不在的ISP(网络运营商)通过dns、http劫持、重写网络包强行在别人网站插入广告,对于无知的用户来讲他们反而觉得当前这个网站真垃圾,这么多广告,看似就是该网站的恶作剧一样,殊不知网站运营者根本不知道自己的网站被强行植入广告,因为ISP分不同地域、不同宽带用户、不同域名等条件来特定植入广告,网站运营者自己访问正常,从而很难发现问题。

更有甚者,某些ISP运营商强行植入的广告会使得网站变的不可用,我就经历过这种情况,某网站在手机端访问时,ISP运营商强行植入的广告挡住了菜单和按钮,使得根本不能操作,对于不明真相的用户来说,肯定要骂娘了,网站运营者属于躺枪。

一、什么是HTTPS

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。

历史上,HTTPS连接经常用于万维网上的交易支付和企业信息系统中敏感信息的传输。在2000年代晚期和2010年代早期,HTTPS开始广泛使用于保护所有类型网站上的网页真实性,保护账户和保持用户通信,身份和网络浏览的私密性。

当网站支持HTTPS协议,即可避免被恶意ISP运营商添加不良信息、使我们提供的服务完整并没有被篡改的交付到最终用户手中,无论用户使用任何ISP运营商。

二、申请证书

证书方面,我选择了Let's Encrypt。这个证书是完全免费且开源的。虽然有效期只有3个月,但是权限很高,父级证书是DST Root CA X3,在Firefox、Chrome等浏览器、安卓和iOS系统等移动设备上都可以正常识别。

在2018年3月份,Let's Encrypt终于支持了通配符格式证书,这是一个伟大的进步,Let's Encrypt证书在易用性方面除了有效期外与每年几千元人民币的商用证书已经没有任何区别。

申请地址:https://www.sslforfree.com/

打开Let's Encrypt首页,在输入框中输入你的域名,其中包含根域名和通配符域名,如图所示:

点击Create Free SSL Certificate进入下一步,如图所示:

提示,如果你想创建通配符证书,必须通过域名DNS方式验证你是该域名的所有者,我们不用管,直接点击Retry Manual Verification进入下一步。

这时,按照提示的信息配置你的域名,增加两条TXT记录(分别是根域名和通配符域名),我用的是阿里云的域名服务,配置完成后如下图所示:

配置完成后点击Download SSL Certificate,这时候它会去验证你配置的TXT记录是否存在,所以建议配置完成后稍等几分钟再点击下载,验证成功后会跳转到如下图所示页面:

这个时候就可以真正下载证书了,点击Download All SSL Certificate Files按钮进行下载,下载后的文件是一个zip压缩包,里面包含三个文件,分别是certificate.crt、ca_bundle.crt和private.key。

三、部署证书并启用

我的系统环境:
  • 系统:Windows Server
  • 容器:Apache、Tomcat、GoRuntime
  • 前置:Nginx
我的后台软件环境比较复杂,其中包括一个php的个人博客(wordpress)、一个基于go语言的git源代码仓库(gogs)、和我自己编写的大量Java语言的SpringCloud服务。他们的一级域名都是liuxp.me,使用不同的二级域名来区别不同的服务,使用了Nginx作为前置机进行反向代理,具体配置可以参考我的另一篇文章《使用nginx建立反向代理》。

在使用通配符证书时,建议在Nginx前置机中进行配置,这样可以极大的简化配置难度,且易于维护。

将下载好的证书文件拷贝到Nginx的conf文件夹中,如图所示:

重点:其中的new.crt文件,该文件是我们把certificate.crt和ca_bundle.crt合并后的文件(打开certificate.crt和ca_bundle.crt,复制其中内容到新建的new.crt中,注意certificate.crt的内容在前,ca_bundle.crt的内容在后)

打开conf配置文件,引用证书路径(注意引用的是我们自己新建的new.crt文件和private.key文件),每个server如果要支持ssl必须都进行引用配置,如下所示:

上面是我的两个web服务,一个是source.liuxp.me,另一个是observer.liuxp.me,都分别引用了证书文件,并且配置ssl选项为on。

强制整站开启https,当访客使用http进入时,自动转换为https地址,增加一行配置即可,如下所示:

将其中的liuxp.me改为你自己的域名即可。

不想自己打字的可以下载我的Nginx配置文件然后改一改。

最后,重启Nginx就生效啦~~~

四、总结

本文仅介绍了手动部署证书的方法,其实Let's Encrypt支持自动部署证书的方式,有多个开源项目支持,以后我会再介绍自动部署的方法。
原创文章,版权归作者刘小平所有,在保留作者姓名与原文地址的情况下允许转载。