This website requires JavaScript.

浅析https----博客全站升级https

2020.07.27 04:48字数 3790阅读 930喜欢 12评论 1

上一篇讲到为组员做了一个electron 爬取工具,方便了很多,但是不能随时随地的搜索,基于成本,开发效率来说,微信小程序是一个不错的选择,小程序要求请求的接口域名需要是https,好的,那就升级吧,索性把我的博客一起升了


一、http有什么问题

  • 通信使用明文传输,易被窃听
  • 报文完整性不能确定,即内容被篡改也无法察觉
  • 不验证通信方的身份

总而言之就是http协议不是很安全

二、https怎么解决这些问题

https并不是一种新的应用层协议,它是在http上建立SSL/TSL加密层,并对传输数据进行加密,可以理解成安全版的http

  2.1、解决通信明文传输

首先介绍两种加密方式 对称加密非对称加密

对称加密:
优点:通信两端Client与Server,都持有相同的秘钥,可以对传输数据进行加密处理,没有密钥就无法对密码解密
缺点:任何人只要持有密钥就能解密了,达不到加密的目的

非对称加密:
优点:是一种一对多的模式,server持有唯一的私钥,公钥是公开的,任何人都可以持有,这种方式不用来回发送秘钥,也不用担心私钥被窃听盗走
缺点:

  • 公钥是公开的,所以针对加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容
  • 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改
  • 使用非对称加密在数据加解密过程需要消耗一定时间,降低了数据传输效率

https 使用的是对称加密 + 非对称加密方式

因为使用对称密钥的好处是解密的效率比较高,使用非对称密钥的好处是可以使得传输的内容不能被破解,因为就算你拦截到了数据,但是没有对应的私钥,也是不能破解内容的。https将两者结合起来,充分利用两者各自的优势,在交换密钥环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。

  2.2、解决报文完整性

Server端将一段文本先用Hash函数生成消息摘要,然后用私钥加密生成数字签名,与原文文一起传送给接收者

Client端只有用发送者的公钥才能解密摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与上一步得到的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性

  2.3、解决验证验证通信方的身份
  • 在解决通信明文传输的部分讲到公钥是看公开的,黑客可以截取公钥,查看报文内容
  • 在解决报文完整性的部分,我们了解到接收者需要用发送者的公钥才能解密摘要信息

可见公钥的传递也同样非常重要,这就要引入了证书颁发机构(Certificate Authority,简称CA),CA数量并不多,Client内置了所有受信任CA的证书。CA对Server的公钥(和其他信息)数字签名后生成证书,即Client可以通过有效的证书获取到安全的公钥

  2.4、TSL/SSL

SSL和TSL是一种安全协议。其中SSL是早起采用的安全协议,后来TSL是在SSL的基础上进一步标准化了SSL协议。在上面的图中可以看到,SSL和TSL位于传输层之上,在数据到达传输层之前都会经过SSL/TSL协议层处理,由SSL/TSL保证数据的机密性和完整性,所以以上的几种解决问题的方式也就是TSL/SSL的工作内容,但是涉及的非常多的学科,密码学,数学等等,本文仅简要说明

SSL证书有很多类型,按认证级别分类:

  • 域名认证(DV=Domain Validation):最低级别的认证,可以确认申请人拥有这个域名
  • 公司认证(OV=Organization Validation):确认域名所有人是哪家公司,证书里面包含公司的信息,安全性更高
  • 扩展认证(EV=Extended Validation):最高级别认证,浏览器地址栏会显示公司名称,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏
  2.5、HTTPS通信的完整流程

三、基于腾讯云服务器的https升级

我们知道了以上原理,剩下的就是容易了,主要工作

  1. 申请SSL证书
  2. 证书放到指定位置,监听 443 端口即可
  3.1、申请SSL证书

腾讯云提供了免费的 域名型(DV)免费SSL证书 和付费的 OV、EV级别的证书申请

如果是个人开发者做一些简单的博客,免费的SSL就可以了

注意:由于CA机构和证书代理商策略调整,从2018年1月1日起,同一主域最多只能申请20张亚洲诚信品牌免费型DV版SSL证书(一级域名及其子域名均属于同一主域,例如 domain.com、ssl.domain.com、ssl.ssl.domain.com 都属于同一主域)

申请审核很快,大概十几分钟就下来了,可以下载证书文件

解压后目录是这样的

我是用的nginx代理,我只关注Nginx文件夹下有一个.crt(证书文件)和.key(私钥文件)

  3.2、配置nginx

将已获取到的 1_xxxxx.crt 证书文件和 2_xxxxx.key 私钥文件从本地目录拷贝到 Nginx 服务器的 /usr/local/nginx/conf 目录(此处为 Nginx 默认安装目录,请根据实际情况操作)下

配置nginx.conf(xxxxxx需要根据自身情况配置,此处仅示意)

server {
     #SSL 访问端口号为 443
     listen 443 ssl http2; 
     #填写绑定证书的域名
     server_name xxxxxx.com; 
     #证书文件名称
     ssl_certificate 1_xxxxxxxx.crt; 
     #私钥文件名称
     ssl_certificate_key 2_xxxxxxxx.key; 
     ssl_session_timeout 5m;
     #请按照以下协议配置
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
     #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
     ssl_prefer_server_ciphers on;
     location / {
        #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
         root /var/www/xxxxxxx.com; 
         index  index.html index.htm;
     }
 }

这些完成后,重启nginx即可

  3.3、升级其他

既然已经升级为https了,就把http2.0也开启了,寻求更好的访问体验,开启方法更简单,在监听后加上 http2即可,http2的优点可以单开一篇了,还不了解的小伙伴可以先了解一下呢

listen 443 ssl http2;

四、写在最后

经过半天的折腾,终于可以https调用接口了,我的小程序可以开始了,作者能力有限,文中若有不正确的地方还请指出,如果有条件的话,还是可以操作一下,可能会出现各种各样的坑,坑才是财富,不是吗,加油,共勉