技术日志:破除内网“安全壁垒”,实现 Hexo 加密与搜索的本地化

背景:环境的“歧视”

在内网环境(http://192.168.47.128:40080)下,现代浏览器会启动“不安全环境”限制。由于没有 HTTPS,浏览器会封锁 crypto.subtlecrypto.randomUUID 等原生加密接口,导致 Hexo-blog-encryptPagefind 插件相继崩溃。 于是博客的搜索和解密功能都失效了。

核心思维:排除错误选项,校准底层变量

Whale3070 遵循“排除法”逻辑,通过以下三个层面的“校准”,彻底打通了内网博客的全部功能。


第一步:资源本地化(排除公网依赖)

为了彻底断开对外部 CDN 的依赖,我们首先确保所有工具库都在本地服务器上。

  1. 下载脚本:crypto-js.min.js 存放在 source/ 目录。
1
2
cd /root/Whale3070.github.io/source/
wget https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js
  1. 修改配置:_config.yml 中配置 vendor_base: /
  • 逻辑: 强制插件在当前域名的根路径寻找解密库,确保内网离线可用。

第二步:环境伪装(手动注入 API 垫片)

针对 Pagefind 报错 crypto.randomUUID is not a function,我们在主题模板中注入了“环境伪装”脚本。

操作文件: /root/Whale3070.github.io/themes/fluid/layout/_partial/header.ejs
在文件顶部加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
/**
* Polyfill: 针对内网非 HTTPS 环境补全 randomUUID
* 逻辑:如果浏览器因为不安全环境封锁了原生接口,我们手动伪造一个
*/
if (!window.isSecureContext && window.crypto && !crypto.randomUUID) {
crypto.randomUUID = function() {
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
};
console.log("已手动补全内网 crypto.randomUUID 接口");
}
</script>


第三步:突破“安全上下文”限制(校准动态变量)

这是最关键的一步。即便有了垫片,加密插件底层的 importKey 依然需要浏览器层面的放权。

  1. Chrome Flag 授信:
    访问 chrome://flags/#unsafely-treat-insecure-origin-as-secure

多地址白名单:在 Chrome 的那个输入框里,你可以用逗号隔开,多填几个备选 IP(比如 http://192.168.47.128:40080, http://192.168.47.129:40080, http://192.168.47.130:40080),这样下次 IP 变了也能直接兼容。

将其设置为 Enabled

浏览器要重启才能生效。

  1. 捕捉“变量位移”:
  • 发现: 系统重启后,虚拟机 IP 从 .130 漂移到了 .128
  • 解决: 将授信地址精准修改为 http://192.168.47.128:40080
  1. 最终验证:
    控制台输入 window.isSecureContext 返回 true。至此,浏览器不再限制 hbe.js 的运行。