https,想要使用你没那么容易

Author Avatar
patrickcty 2月 01, 2017

背景

今天在搞博客的时候突然想给域名加上https,正好瞟到腾讯云里面又免费的SSL证书可以申请,于是抱着试一试的心态点了进去。没想到耗费了大半个下午。

得到SSL证书

其实获得SSL证书并不难,由于域名还有服务器都在腾讯云上,所以在腾讯云上申请一个证书就比较容易了。

刚开始的时候我还以为http变成https非常困难,后来知道只用申请一个SSL证书就可以https加持了,然而事情就是这么简单么?

一开始我只想给我的个人博客加上https,结果在申请SSL证书的时候卡住了,倒是jnugeek.cn很快就申请通过了,于是决定先给jnugeek.cn加上https。

显示https没那么容易

根据腾讯云的文档,在nginx上使用https只用下载证书然后把证书安装在相应的地方并修改nginx的配置文件就可以了,在改的时候我也遇到了很多的坑,不过也这也加深了我对nginx的理解。下面附上nginx的相关配置:

server {
    listen 443;  # https监听443端口
    server_name www.domain.com; #填写绑定证书的域名
    ssl on;
    ssl_certificate 1_www.domain.com_bundle.crt;
    ssl_certificate_key 2_www.domain.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    ssl_prefer_server_ciphers on;
    location / {
        root   html; #站点目录
        index  index.html index.htm;
    }
}

server {
    listen 80;  # http监听80端口
    server_name www.domain.com;
    rewrite ^(.*) https://$host$1 permanent;  # 把80进来的请求重定向到https
}

其中每个server都是独立的虚拟机,因为http和https本身就是不相互兼容的,所以这里指定两个也不奇怪了。

关于nginx的配置这个说的很清楚了。

刚开始我就在server的配置吃了一点小亏,我只是机械的把ssl的部分加上去了,结果果然是没什么卵用,直到改成上面这种样式才终于可以了!

于是乎在浏览器就惊喜的看到了https~而且即使输入的是http也会自动定向到https~到这里的时候我真的超级开心!然而我还是高兴地太早了,https的那把绿色的小锁并没有显示出来…

网站中含有不安全的内容

使用上了https后并没有想象中的那么棒,相反很多问题出现了。

当我用Ubuntu自带的浏览器打开时我发现它提示网站中含有不安全的内容,Google之后发现是因为https和http混合使用。网站上那些放在七牛云上的静态文件现在反而让网站成为了不安全网站,而且后来我在Chrome上看的时候发现js都被屏蔽了,图片也是显示黄色三角警告。

后来我看到,黑客可能通过http对js文件进行篡改,而js代码又是可执行的,于是可以造成很严重的后果,这样看来js被屏蔽也是可以理解的。

为了解决这个问题,我打算把静态文件转系到一个https的服务器上,然而试了腾讯云的对象储存服务,以及七牛云的相关服务后发现依然是http。

很多大公司他们的静态文件都是放在自己专门的服务器上的,这样的话就不用依靠第三方的了,这对于我们这种学生党,个人开发者就不是很好了…不过其实七牛云上面好像有相应的https服务,这是然而当时因为另外的问题决定暂时放弃https了。

在折腾对象储存服务,还接触到了CDN,CDN是把各个不同的请求,根据地域等从不同的服务器分发,这样就能加快加载速度了。

之后我还发现了https问题并不只在静态文件上,post的时候也出现了问题,当我提交表单的时候并没有跳转回相应的界面,而是最简陋的白色背景界面…这时候我才意识到这样贸然上https确实不太明智,于是决定先回到http了。然而我改回http之后还是有一些问题,看来是网站本身的问题了,这锅https不背!

其实关于ajax,如果是相对路径那么就没影响,绝对路径就要考虑http与https的问题了。

但是当我在服务器中改变了相应的文件之后,发现依旧是https,然而刷新的时候会报错,后来我看到一旦浏览器使用https建立了安全连接之后就不会再用http访问了…即使我改过来了依旧不行…不过好在应该只有我受影响了…

https果然不是那么容易就能搞定的啊。(说不定只是我太菜了而已…现在看来主要是静态文件加载的问题,以及网站本身的一些bug..总之上https还是要权衡,毕竟我这个不涉及到隐私信息,支付等。

关于https

https比起http要安全的原因就是https在浏览器和应用中另外还加了一层,在这一层中他对明文传输的TCP/UDP进行了加密,这样就保证了相应的安全。

还有就是网站加入了SSL证书,这个证书很难被伪造不被发现,也就是说长得很像钓鱼链接就更容易被识别啦。

也学了好多域名的知识呢

另外因为最近在搞个人博客,为了搞得更好就又申请了一个域名,同时也把域名升级到了https~虽然并没有本质的区别,但是装逼度高了不少~

GitHub Pages的域名

对于一个GitHub账号来说,GitHub Pages可以有很多,但是以自己的账号名+github+io为域名的GitHub Pages只有一个。而对于很多生成的博客来说,只有用这个域名才不会出现路径上的问题。而这样的域名只有你把仓库名也改成相应的自己的账号名+github+io就可以了,这是一个坑一定要注意。

如果想使用自己的域名,则两步走:

  • 在域名解析控制台里面加入一个记录类型为CNAME的记录,并把记录值改为你的原本域名
  • 直接在GitHub的设置你面改成你的自己的域名

关于域名解析

我们一开始申请到的域名都是一级域名,而我们平常看到的www.xxxx.com是二级域名。

那些www甚至blog打头的都是经过解析的结果,其实只要在域名解析中指定主机就可以了。

主要的记录类型:

  • CNAME:将域名指向另一个域名
  • A:将域名指向一个ipv4地址

主机记录:

  • 就是二级域名打头的那些,如果是@就使用一级域名

记录值就与上面的记录类型相对应就可以了。

给GitHub Pages的自定义域名加上https

直接加证书是不是很现实的,因为服务器是GitHub上的,所以就要用另外的方法了。

这里用到了CloudFlare。原理就是:

  • 域名使用CloudFlare的域名服务器解析
  • 它提供的服务处于我们的网站服务器和我们的网站访问者之间,其原理是缓存了我们服务器上的页面,所以实际用户建立的 HTTPS 连接是用户的浏览器与 Kloudsec 之间的。本句出处

相关教程

最后

折腾了一大圈,尽管结果不尽如人意,不过还是学到了不少东西的。

另外自己还是太弱了,以后还要继续加油呀。

P.S.为了搞这个都没有复习…囧…