这里是某 铸币 作者 LXR 与陈年 bug 斗智斗勇的一条总结 绝对不是 BUG 忘记了之类的

# 故事开端

LXR 是在步入大学的第二年才开始配置自己的小博客的,俗话说的好, 故事的开始总是极具温柔 万事开头难,某人忙活了一个多月总算是给网站好了,不能说有多好,只能说是 光鲜亮丽 初具人型。

后来在后续进行了一系列 猛男 风格美化之后,网站中于是看起来丰富了许多,于是就陆陆续续的开始写一些小文章( 虽然没什么人看 )。

# 我们的初见

就在 LXR 初步完成博客的建设并开始兴奋的与大家互换友链的时候,LXR 发现了一个问题:

“为什么我的网址前面总是会提示不安全?”

刚开始因为课业不少 + 每天还有其他事情比如各种的培训、学习、活动 、打游戏 之类的事情,所以一直没时间管。于是一直安慰自己说:” 没事的只是一个角标,浏览的时候又看不见,眼不见心不烦 “。

等后来 LXR 没那么忙了之后,她越看越觉得这个 “不安全” 标识很刺眼 也是被某学姐吐槽说怎么你的博客还顶了个不安全标识,速速去修一下

于是 LXR 开始寻找问题的根本原因。

# 第一次着手解决

LXR 在越看越不顺眼的情况下,查阅了一些资料并在服务器控制台,发现可能是证书过期导致的 后来想了下最开始的时候他就存在的话,其实是跟证书过期没直接关系的,铸币 LXR ,于是她决定部署一下免费 SSL 证书(这东西一年 20 张,到期记得换就行)。

就当 LXR 按部就班的购买证书、配置并签发证书、下载证书之后,她发现了一个至关重要的问题:

“tnd 我证书存放路径我给设置哪去了?”

这里就不得不说一句 “铸币 LXR” 了。因为 LXR 最开始配置的时候是自己配置 中间卡住了就请教学姐版 的,所以有一些配置并没有沿用自带的默认配置,就导致 铸币 LXR 忘记了自己的 nginx 下存放 ssl 整数的路径是哪里,同时也没找到 nginx 配置文件放哪里了 因为 nginx 安装目录和可执行文件目录也是自定义的,全搞忘了 ,于是在经历了一系列找寻和尝试之后最后还是暂时搁置了 (确实是找了好久没找到 and 又忙起来了所以选择暂时搁置下来 绝对不是因为 LXR 懒 )。

# 第二次见面并解决一部分

时光荏苒岁月如梭 总之就是 LXR 懒了很久之后 ,一眨眼 LXR 都毕业步入社会开始工作了。

在这段时间里,LXR 还是会陆陆续续的更新自己的小站(虽然后面开始更新美食食谱和经验分享了),让它看起来不会太冷清,但是那个 “不安全” 角标总是像一根刺一样时不时扎眼睛一下令人难受。

于是就在最近,LXR 没那么忙的时候就开始着手彻底解决这个问题。

第一步,当然就是换一个新的免费 SSL 证书了(当然不是 LXR 扣,有没有用得先试了才知道,不然不是白买了 当然修好了估计也不会买 )。于是在新一轮的购买证书、配置并签发证书、下载证书之后,她又回到了问题的起点:

“tnd 我证书存放路径在哪?上次就没找见。”

好在此时的 LXR 并不是最开始的菜鸟 LXR 了 虽然现在来说也没有强到哪里去 ,她使用了 which 命令来查找她想要的东西。

此时我们应该来了解一下 which 命令了:

# which 是什么

which 命令是 Linux 中的一项文件操作,用于定位系统中的可执行文件。

which 指令会在环境变量 PATH 设置的目录里查找符合条件的文件。

which 命令在所有主流的 Linux 发行版中都是可用的,并且在大多数系统中, which 命令都是预安装的,无需额外安装。

# which 命令的基本语法

which 命令的语法非常简单

1
which filename

这里的 filename 就是你要查找的文件名或命令名。

# 查找单个命令的位置

例如,你要查找 java 命令的位置,你将使用下面这段指令:

1
which java

输出可能是这样的:

1
/usr/bin/java

这告诉我们 java 命令的位置在 /usr/bin/java

# 查找多个命令的位置

1
which man java python nada

输出可能是这样的:

1
2
3
/usr/bin/man
/usr/bin/java
/usr/bin/python

这告诉我们 manjavapython 命令的位置,而 nada 命令没有找到

# which 命令的常用选项或参数说明

which 命令的语法格式如下:

1
which 参数 文件名

常用参数见下表:

选项 描述 选项 描述
-a 显示 PATH 变量中所有匹配的可执行文件 –help 显示帮助信息
-n 设置文件名长度(不含路径) –read-functions 从标准输入中读取 shell 函数定义
-p 设置文件名长度(含路径) –show-tilde 使用波浪线代替路径中的家目录
-V 显示版本信息 –skip-dot 跳过 PATH 变量中以点号开头的目录
-w 设置输出时栏位的宽度

例如,当我们要查找所有匹配的路径时,我们可以使用 -a 参数来进行查找:

1
which -a program

输出可能是这样的:

1
2
/usr/bin/program
/usr/local/bin/program

这表示 program 在这两个地方都有可执行文件。

# which 命令的注意事项

  • which 命令只适用于可执行文件。
  • 如果 which 命令在当前路径中找不到可执行文件,它将返回空。

# 第二次见面的最终处置

问题的处置还在继续。

在使用了 which 命令后,LXR 顺利找到了 nginx 的安装路径,并找到了 nginx 的证书配置文件,在这里找到了 SSL 证书的存放路径。

欣喜若狂的 LXR 通过 winSCP 将下载好的证书文件上传至服务器指定路径,修改配置文件并重启 nginx 服务后,她开始验证重新部署的证书是否有用。

当她使用浏览器打开本站时,她发现:

“tnd 怎么这个不安全标志还在?”

后面怀疑是浏览器缓存导致的问题,索性使用 InPrivate 无痕浏览来访问网站,果然发现了问题原因。

居然是因为网站不支持 HTTPS 访问导致的。

NoHTTPS

于是 LXR 开始着手调查此事。

# 解决不支持 HTTPS 的问题

最开始怀疑是 443 端口未开放,索性在安全组里面寻找 443 端口,发现安全组已经配置了 443。

safe443

之后在 nginx 配置文件中补齐 443 端口配置(类比 80 端口),再次重启 nginx 服务发现依旧不支持 HTTPS,于是在服务器上找问题。

# 在服务器找寻问题

# 服务器 443 端口是否监听

首先怀疑服务器 443 端口是否监听,于是使用 netstat -ntlp 命令来查看一下。

1
netstat -ntlp

netstat -ntlp 命令会显示所有 TCP 网络连接、监听端口,并显示对应的进程名和 PID。

返回结果如下:

listen443

说明 443 和 80 端口一样已被监听。

# 查询防火墙状态

排除端口未监听原因之后就该排查防火墙的问题了。铸币 LXR 曾在刚刚搭建本站时因为防火墙设置问题总是出现奇怪的访问问题,所以还是排查一下的好。

先使用 systemctl status firewalld 命令查询防火墙运行状态。

1
systemctl status firewalld

返回结果如下:

firewalld

说明防火墙正在运行中并且配置了开机自启。

# 查询防火墙配置

使用 firewall-cmd--zone=public-list-all 命令查询防火墙中 public 区域的所有配置详情。

1
firewall-cmd--zone=public-list-all

返回结果如下:

firewalld-public

可以看到只允许了 80 端口(HTTP)和 3306 端口(MySQL 数据库)的访问,并没有开放 443 端口。

# 配置防火墙

发现未配置 443 端口之后就好解决了,只需要给防火墙配置一下就行了。

使用如下代码来配置防火墙:

1
2
firewall-cmd--permanent --add-port=443/tcp
firewall-cmd--reload

这些指令的作用是,在防火墙中添加一条规则,允许 TCP 协议的 443 端口流量通过,并将配置写入永久规则,重启后依然生效;同时重新加载防火墙规则,让刚才添加的永久配置立即生效,而不需要重启整个防火墙服务。

在这之后,外部网络就可以正常的通过 HTTPS 访问网站。

Tip:记得为 443 端口配置 root 路径和 index 界面,不然 HTTPS 访问会直接跳转到 HTTP Server Test Page,如下图:

HTTPS-Test

# 总结

下面开始问题总结:

寻找文件 / 命令时可以通过 while 命令来寻找。

通过配置文件配置 80/443 端口的访问路径与网站情况。

HTTPS 访问需要在服务器防火墙、nginx 配置文件以及服务器安全组中分别配置 443 端口,之后才能正常访问。

Tip:记性不好的小伙伴们可以在配置的时候将一些路径信息记下来,存放在显眼不会忘记的位置,这样就算忘了也可以查看一下。

顺带一提,铸币 LXR 前段时间给 GitHub 账号的 2FA 忘记了,最后翻邮件才找到的。

补药骂 LXR 是铸币了 T_T