0. 开端

我做了一个给班级用的纪念网站,可以在上面写下自己对其它同学的影响。
但是,我因此被骂了一顿。为什么要骂我?

浏览器显示你的网站不安全,你肯定是想黑掉我们的电脑!

因此,我打算给我的网站加上一个 SSL 证书,来堵住他们的嘴。

1. 证书哪里来

证书要从哪里来?
我刚开始建设这个网站的时候,去瞄了一眼价格,哇,大几千一年,算了,穷人不配用 https://
但是,后来根据伟大的Q群群友的指导下,我才知道有一个叫做 DV 域名型 SSL证书 的玩意。

这玩意有几个显著的优点:

  1. 自由 免费
  2. 大部分厂商可以让你续期非常多次(腾讯云为20次,一次一年),基本上可以在你的网站倒闭之前都持续提供,就算那时你的网站还开着,也应该可以盈利了

当然也有其它的方法可以拥有免费SSL证书,但是 其它的听说都没听说 这个已经够用了!所以说我们今天就是基于这个证书展开教程。
申请指南(以腾讯云为例):

  1. 请来到对应的免费域名申请链接(腾讯云为 https://console.cloud.tencent.com/ssl/dsc/apply
  2. 请填写好页面上所有要求你必须填的东西,选填的想写就写
  3. 选择验证方式的,比较推荐自动添加DNS解析,那个样子又可以省掉一步了

    注意!如果你没有这个选项的话,请根据页面上的提示操作!

  4. 然后请坐一会,静静等待证书的签发。通常不会超过半天 可你才签过一次啊,不过在这期间,证书文件就可以下载了。
  5. 证书文件下载下来后,我们就可以开始操作了。

2.开始操作

  1. 将下载好的压缩文件解压后使用 ftp 上传至服务器

  2. 有三个文件:

    1. (你的站点名字).crt
    2. (你的站点名字).key
    3. root_bundle.crt
      这三个文件分别要放在/etc/ssl/certs/(你的站点名字.crt和root_bundle.crt)和/etc/ssl/private(你的站点名字.key)
  3. 打开你原先的配置文件。然后做一番更改:

    1. 将映射的端口号从 *:80 改为 *:443

    2. 在配置文件里加上一堆东西:

      SSLCertificateFile      /etc/ssl/certs/你的网站域名.crt
      SSLCertificateKeyFile /etc/ssl/private/你的网站域名.key
      SSLCertificateChainFile /etc/ssl/certs/root_bundle.crt
      SSLProtocol  all -SSLv2 -SSLv3
      SSLCipherSuite ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL
      SSLHonorCipherOrder on
      

      这些是给网站配置SSL证书。

  4. 保存文件后记得检查语法

    apachectl configtest
    

    如果语法检查没有问题的话,那么就重启apache2:

    systemctl restart apache2
    
  5. 在你的网站域名前加上 https://,享受SSL证书带来的安全性吧!

3.自动跳转 https://

因为我们输入网址时通常只会输入域名,所以说我们还要做一个 http:// 自动跳转 https:// 的功能。
其实有很多优雅很多的解决方案,但是由于SB作者一个都看不懂,我们打算用一种最暴力的方式。

  1. 我们为了能够把使用 http:// 的用户赶到 https:// 上面去,需要启用一个叫做 rewriteApache 模块。
    用下面的一行代码启动它:

    a2enmod rewrite
    
  2. 新建一个配置文件,叫什么都可以,只要确保它在 /etc/apache2/sites-available 目录下。

  3. 然后在里面写下如下的内容:

    <VirtualHost *:80>
       ServerName 你的网站域名
    </VirtualHost>
    

    你们应该注意到了,此处我们监听的是80端口。这象征着访客是使用 http:// 访问到我们的主机的。刚刚配置好 https:// 端口的我们必定要向他们显摆显摆,所以说,我们要加上几句话,让他们被迫拽到 https:// 访问来:

    RewriteEngine on
    RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
    

    这些玩意儿是什么东西?一行一行的解释。
    第一行:RewriteEngine on 开启让我们的网站可以把别人赶到其它网站的功能。对,就是前文所述的 rewrite
    第二行:RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] 这行需要解释一下。
    首先,RewriteRule 是干嘛用的?这玩意用来指定你要把用户从这个配置文件对应的网站,再扔到哪个网站。

    TIPS:其实一般 RewriteRule 在前面会跟着一个 RewriteCond,用于指定用户访问哪个URL时才要把他扔到另一个网站。
    但是我们这里无论在哪里使用 http:// 访问都要把它扔到 https:// 那里去,所以就把 RewriteCond 给免了!

    RewriteRule 后面跟着的一大串又是什么?

    1. ^(.*)?$ 根据百度搜索,为一个正则表达式,由于不懂,在此引用他人的说明:

      这是正则表达式,^是开头,$是结束,/?表示有没有/都可以(0或1个),(.*)是任何数量的任意字符

    2. https://%{SERVER_NAME}%{REQUEST_URI}
      %{SERVER_NAME} 所代表的是目前网站的域名
      %{REQUEST_URI} 指的是网站域名后的那一串后缀。例如 https://supermains.oier.space/posts,它的 %{REQUEST_URI} 就是 /posts

      注意:%{REQUEST_URI} 前面是带斜杠的!

      所以说这两个玩意组合起来,便成为了由 http:// 变成了 https:// 的网站 URL

    3. [L,R] 意义不明,百度无果,就当成玄学吧

    这个文件的说明到此为止。

  4. 激活这个文件:

    a2ensite 刚刚的文件名
    

    然后重启 Apache

    systemctl restart apache
    
  5. 试着去访问一下。

现在,你就成功了搭建了一个从 http://https:// 的重定向了。
妈妈再也不用担心我被同学说是黑客啦!(直接输入访问默认为 http://

4. 神奇的 HSTS

还没完!我们可以使用一系列措施让我们的网站更加安全。

有一天,你和你的同学在饭店吃饭,你们惊奇的发现店里有免费的 Wifi,并高兴的使用它访问网上银行。但是这个 Wifi 是黑客的电脑发出的,他截取了你的请求,然后把他们转发到假的网上银行,让你们的数据暴露出来。

真是一件可怕的事情呢!将网上银行换成你的网站,说不定黑客可以盗取你的网站的用户密码,然后用这玩意做些奇奇怪怪的事情......
所以说,需要防御。全新的标准给出了 HSTS 这个东西,他可以帮助你防御像上文所说的问题。
如何处理?其实很简单。我们要启动一个插件,那个插件可以更改 HTTPHEAD

a2enmod headers

然后在监听 *:443(也就是监听 HTTPS 请求的)文件里,在 </VirtualHost> 前面加上一行语句:

Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"

就好了!

posted on 2022-04-21 20:16  超能少年飞  阅读(337)  评论(1)    收藏  举报