一次令人窒息的SSL配置
引子
你们知道的,我在2022年6月12日在小站上引入了一个博客加密的插件hexo-blog-encrypt
,自从配置了这个插件之后,我发现它在某些情况下会失效(也就是输入密码后无法进行响应)。渐渐我发现了它失效的同一性(都不是国产浏览器,其中包括:Google、Safari、Firefox…),而当我在国产浏览器上进行测试时,一切正常(见了鬼了😇)!
问题的起源
事情的由来是这样的…
今天的时候,本想着顺着前几天的心意给博客去找一个看帖子能看得更加舒服和直观的主题。但是看着看着就看到了Hexo的插件模块上面去了。我百无聊赖地浏览着,想找些有趣的插件配置上去。但看到的都是些熟悉的插件,正好看到hexo-blog-encrypt
这个我曾经引入的插件。我想着看都看到了,不如再去看看有没有解决上面问题的办法。巧了,一看还真有->issue #83
可以看到是无法打开在线加密帖子的问题,提问的人跟我一样,在本地端测试的时候完全没有问题,但一旦在线测试,就出现了以上的情况。我看了他们的回答,大多跟JQuery链接有关,而这个我从来没接触过,不想随意配置,我就换了百度搜索。然后发现了这篇文章为网站安装安全证书解决hexo-blog-encrypt插件无法使用的问题,里面讲的很清楚,具体原因是由于密文传输使用http协议,而插件使用的api接口为https,导致无法使用。情况如下
所以我要为自己的网站配置ssl证书来启用https协议。
关于SSL证书
关于SSL证书,我大一上的时候曾经尝试过,当时我的博客也刚刚搭建完成,刚刚经历过一次服务器配置折磨的我不想快速的开启第二轮折磨,所以事情就这样一直搁置着,直到今天…在网上简略地搜了一下之后,我决定使用阿里云的DigiCert 免费版 SSL
经过简单的创建,我成功申请到了一个免费证书。通过阿里云免费证书ssl的部署这篇文章,我开始对好久没有打开的阿里云服务器进行部署。
关于vim
中间遇到了一个小插曲——我把vim的命令忘了,自然也忘了如何开始写入和保存退出,经过一番简单搜索,我收集到了以下资料:
命令 | 作用 |
---|---|
输入a 或i 或o (包含大小写) |
进入输入模式(6个命令插入的位置不同) |
按Esc | 跳到命令模式 |
:[w/q/wq/q!/wq!] | 进入末行模式 |
w |
保存不退出 |
q |
不保存退出 |
wq |
保存并退出 |
! |
强制 |
关于云服务器ECS
经过保存并退出后我按照步骤很快就进行到了最后一步。
然后我遇到了第一个问题,我将重启服务理解成了重启云服务器ECS实例。所以我想当然的对云服务器进行了重启。
然后…博客就无法访问了,这时的我还没有太上心,自信源于经验主义。事实证明经验主义取不得啊😅,回去翻看了一下搭建博客时采纳的文章,猜测可能是nginx配置文件修改后,未重启重新加载导致的。
关于Nginx
然后我遇到了第二个问题,我忘记nginx怎么重启了,查阅部分资料后采纳了Nginx怎么重启这篇的方案,进入nginx安装目录的sbin下,(注意是安装目录)。然后通过以下代码进行验证。
1 | [root@izbp17w9kj059p6qew5dzlz sbin]# ls |
看到如下显示:nginx.conf syntax is ok
,nginx.conf test is successful
说明配置文件正确!但我在验证的时候就遇到了第三个问题——未开启SSL模块。
关于SSL模块
在运行./nginx -t
这行代码的时候,我遇到了以下报错信息:
1 | nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:107 |
通过查阅相关资料,我在这篇文章下找到了解决方法安装 ngx_http_ssl_module 模块。
在nginx的安装目录下(一开始我忘了安装目录在哪,后来去根目录下面找了一番才找到www/server/nginx
),找到后configure执行以下代码:
1 | /usr/local/ngxin/sbin/nginx -V#注意是大写的V |
得到nginx的版本信息和所安装的模块,接着我就遇到了第四个问题——nginx版本太低。
关于升级Nginx
执行以上代码后我得到了以下报错信息:
1 | nginx: [warn] invalid value "TLSv1.3" in /usr/local/nginx/conf/nginx.conf:117 |
大意是不支持TLSv1.3版本。由于Nginx保持着较快的更新速度,在Nginx1.0.13版本及以上才支持TLSv1.3,而我的Nginx版本则是Nginx1.10.1,所以必须对Nginx进行升级。在www/server/
目录下通过以下命令:
1 | wget http://nginx.org/download/nginx-1.16.1.tar.gz |
得到1.16.1版本的nginx,接着解压下载好的文件,并进入文件夹进行编译(只编译不安装)
1 | [root@izbp17w9kj059p6qew5dzlz www]# tar xf nginx-1.16.1.tar.gz |
可以看到在第三行代码加入./configure --user=nginx --with-http_ssl_module
这一串命令,直接省去了到时候再次配置SSL模块的麻烦。这里要注意的是要在执行以上代码之前先通过下面这串代码获取旧nginx的版本和编译参数:
1 | /usr/local/ngxin/sbin/nginx -V#注意是大写的V |
返回得
1 | [root@XiaoFeng sjd]# /usr/local/nginx/sbin/nginx -V #注意是大写的V |
发现configure arguments:
后没有任何参数,代表旧版本nginx上没有导入任何模块。(如果有,要加入上述第三行./configure --user=nginx
的后面 )
这样以后,备份旧版本的nginx的执行程序:
1 | [root@izbp17w9kj059p6qew5dzlz nginx-1.16.1]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx12.old |
然后替换旧的nginx的执行程序:
1 | [root@XiaoFeng nginx-1.16.1]# cp objs/nginx /usr/local/nginx/sbin/ |
发送USR2信号给旧版本主进程号,使nginx的旧版本停止接收请求,用nginx新版本接替,且老进程处理完所有请求,关闭所有连接后,停止。
1 | [root@izbp17w9kj059p6qew5dzlz sbin]# cd ../ |
我和没有执行上述的第五行代码一样成功了。
最后查看升级后的版本
1 | [root@izbp17w9kj059p6qew5dzlz logs]# /usr/local/nginx/sbin/nginx -v |
平滑升级完毕。
最后的最后
然后重新再回到重启nginx的部分,进入nginx可执行目录sbin下,再输入以下代码:
1 | [root@izbp17w9kj059p6qew5dzlz sbin]# ./nginx -s reload |
返回报错信息如下
1 | nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid" |
再次搜索得到解决办法,执行命令
1 | /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf |
重新加载配置文件
再次执行命令
1 | [root@izbp17w9kj059p6qew5dzlz sbin]# ./nginx -s reload |
重启nginx,无回显,重启成功。
结局
再次访问博客,发现成功加载
用https协议访问,同样成功加载
总耗时三个半钟头,SSL配置就此告一段落…