0. 开端
我做了一个给班级用的纪念网站,可以在上面写下自己对其它同学的影响。
但是,我因此被骂了一顿。为什么要骂我?
浏览器显示你的网站不安全,你肯定是想黑掉我们的电脑!
因此,我打算给我的网站加上一个 SSL 证书,来堵住他们的嘴。
1. 证书哪里来
证书要从哪里来?
我刚开始建设这个网站的时候,去瞄了一眼价格,哇,大几千一年,算了,穷人不配用 https://。
但是,后来根据伟大的Q群群友的指导下,我才知道有一个叫做 DV 域名型 SSL证书 的玩意。
这玩意有几个显著的优点:
自由免费- 大部分厂商可以让你续期非常多次(腾讯云为20次,一次一年),基本上可以在你的网站倒闭之前都持续提供,就算那时你的网站还开着,也应该可以盈利了
当然也有其它的方法可以拥有免费SSL证书,但是 其它的听说都没听说 这个已经够用了!所以说我们今天就是基于这个证书展开教程。
申请指南(以腾讯云为例):
- 请来到对应的免费域名申请链接(腾讯云为 https://console.cloud.tencent.com/ssl/dsc/apply)
- 请填写好页面上所有要求你必须填的东西,选填的想写就写
- 选择验证方式的,比较推荐自动添加DNS解析,那个样子又可以省掉一步了
注意!如果你没有这个选项的话,请根据页面上的提示操作!
- 然后请坐一会,静静等待证书的签发。通常不会超过半天
可你才签过一次啊,不过在这期间,证书文件就可以下载了。 - 证书文件下载下来后,我们就可以开始操作了。
2.开始操作
-
将下载好的压缩文件解压后使用
ftp上传至服务器 -
有三个文件:
(你的站点名字).crt(你的站点名字).keyroot_bundle.crt
这三个文件分别要放在/etc/ssl/certs/(你的站点名字.crt和root_bundle.crt)和/etc/ssl/private(你的站点名字.key)
-
打开你原先的配置文件。然后做一番更改:
-
将映射的端口号从
*:80改为*:443 -
在配置文件里加上一堆东西:
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证书。
-
-
保存文件后记得检查语法:
apachectl configtest如果语法检查没有问题的话,那么就重启apache2:
systemctl restart apache2 -
在你的网站域名前加上
https://,享受SSL证书带来的安全性吧!
3.自动跳转 https://
因为我们输入网址时通常只会输入域名,所以说我们还要做一个 http:// 自动跳转 https:// 的功能。
其实有很多优雅很多的解决方案,但是由于SB作者一个都看不懂,我们打算用一种最暴力的方式。
-
我们为了能够把使用
http://的用户赶到https://上面去,需要启用一个叫做rewrite的Apache模块。
用下面的一行代码启动它:a2enmod rewrite -
新建一个配置文件,叫什么都可以,只要确保它在
/etc/apache2/sites-available目录下。 -
然后在里面写下如下的内容:
<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后面跟着的一大串又是什么?-
^(.*)?$根据百度搜索,为一个正则表达式,由于不懂,在此引用他人的说明:这是正则表达式,^是开头,$是结束,/?表示有没有/都可以(0或1个),(.*)是任何数量的任意字符
-
https://%{SERVER_NAME}%{REQUEST_URI}
%{SERVER_NAME}所代表的是目前网站的域名
而%{REQUEST_URI}指的是网站域名后的那一串后缀。例如https://supermains.oier.space/posts,它的%{REQUEST_URI}就是/posts注意:
%{REQUEST_URI}前面是带斜杠的!所以说这两个玩意组合起来,便成为了由
http://变成了https://的网站URL。 -
[L,R]意义不明,百度无果,就当成玄学吧
这个文件的说明到此为止。
-
-
激活这个文件:
a2ensite 刚刚的文件名然后重启
Apache:systemctl restart apache -
试着去访问一下。
现在,你就成功了搭建了一个从 http:// 到 https:// 的重定向了。
妈妈再也不用担心我被同学说是黑客啦!(直接输入访问默认为 http://)
4. 神奇的 HSTS
还没完!我们可以使用一系列措施让我们的网站更加安全。
有一天,你和你的同学在饭店吃饭,你们惊奇的发现店里有免费的 Wifi,并高兴的使用它访问网上银行。但是这个 Wifi 是黑客的电脑发出的,他截取了你的请求,然后把他们转发到假的网上银行,让你们的数据暴露出来。
真是一件可怕的事情呢!将网上银行换成你的网站,说不定黑客可以盗取你的网站的用户密码,然后用这玩意做些奇奇怪怪的事情......
所以说,需要防御。全新的标准给出了 HSTS 这个东西,他可以帮助你防御像上文所说的问题。
如何处理?其实很简单。我们要启动一个插件,那个插件可以更改 HTTP 的 HEAD。
a2enmod headers
然后在监听 *:443(也就是监听 HTTPS 请求的)文件里,在 </VirtualHost> 前面加上一行语句:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
就好了!
浙公网安备 33010602011771号