博文

目前显示的是标签为“案例”的博文

Hysteria2 服务端自签证书 V2ray客户端指定证书指纹 pinSHA256 证书锁定 Certificate Pinning

图片
前言 上一篇我们解决了 Hysteria2 客户端指定证书 现在我们来尝试用 V2ray作为客户端, 指定证书 文档 https://www.v2fly.org/config/transport.html#tlsobject 修改本地配置文件 试试. 报错. 尝试将日志中的  TeddTPwg0va7l8sJsBuTlrK6us6X+7GdxnssJ+JRuso= 写到配置文件中, 如下 测试成功. 分析 其实  4de75d4cfc20d2f6bb97cb09b01b9396b2babace97fbb19dc67b2c27e251baca 和  TeddTPwg0va7l8sJsBuTlrK6us6X+7GdxnssJ+JRuso= 本质上对应的原本的字节码是一样的. 只是前面那个是字节码转 hex, 后面是字节码转 base64. 在 Linux 上要得到 base64 格式的, 可以这样: openssl x509 -in your_cert.crt -outform DER | sha256sum | awk '{print $1}' | xxd -r -p | base64 或 openssl x509 -noout -fingerprint -sha256 -in your_cert.crt | sed 's/^.*=//' | xxd -r -p | base64 其中  | xxd -r -p | base64 的意思是, 从 hex 恢复成字节码, 再转 base64 总结 V2ray 客户端在对接服务端 Hysteria2 协议时, 可以指定证书的指纹, 但是要使用 base64 的形式. 形如, {   "protocol": "hysteria2",   "settings": {     "servers": [       {         "address": "服务.端.IP.地址",         "port": 服务端口       }     ]   },...

Hysteria2 服务端自签证书 客户端指定证书指纹 pinSHA256 证书锁定 Certificate Pinning

图片
前言 最近翻墙圈的氛围是研究服务端自签证书时, 客户端最好固定证书以避免中间人攻击. 理论支持 Hysteria2文档 https://v2.hysteria.network/zh/docs/getting-started/Client/#__tabbed_1_3 Hysteria2 服务端 问GPT, 计算证书的sha256 openssl dgst -sha256 certificate.crt 所以我的就是 openssl dgst -sha256 /etc/ssl/private/learn.microsoft.com.crt 得到 SHA2-256(/etc/ssl/private/learn.microsoft.com.crt)= a178a313215bd1db5f0256a7f56b23e97f00c2f89a7a47e42e36ad67e820131d Hysteria2 客户端 配置文件照着上面文档说的来, 就是 server: 服务.端.IP.地址:服务端口 auth: 密码 socks5:   listen: 127.0.0.1:20888 http:   listen: 127.0.0.1:20889 tls:   insecure: true   pinSHA256:  a178a313215bd1db5f0256a7f56b23e97f00c2f89a7a47e42e36ad67e820131d 命令行跑一下试试. 报错 PS D:\GFW\hy2> .\hysteria-windows-amd64.exe 2025-11-10T12:24:22+08:00       INFO    client mode 2025-11-10T12:24:23+08:00       FATAL   failed to initialize client     {"error": "connect error: CRYPTO_ERROR 0x12a (local): no certificate matches the pinned hash "...

向外访问网络行为次序随机的场景下 预设网络资源 预设替代命令

图片
前言 上一篇 我们处理了 向外访问网络行为次序固定的场景下 预设网络资源 预设替代命令 现在我们来处理 次序随机的场景 典型例子就是 233脚本. https://zelikk.blogspot.com/2025/11/fake-curl-wget-sh.html 我们先在无预设命令的条件下, 执行一遍安装过程. cd fake-curl-wget-sh-main source fake-curl-wget-v2.sh cd bash install-233.sh 然后分析日志. 需求 编辑 __fake_net_common.sh , 添加预设命令. 因为网络访问的次序是随机的, 所以我们只能从网络资源的特征入手. 我们要对 wget --no-check-certificate -t 3 -q -c https://github.com/233boy/xray/releases/latest/download/code.zip -O /tmp/tmp.dO84swIzMs/tmpsh  设置预设命令 cp /root/code.zip /tmp/tmp.dO84swIzMs/tmpsh  结合上一篇的 第几个参数 的经验  再问问GPT 怎么在shell脚本中实现匹配关键字. 得到 if printf '%s\n' "$@" | grep -qE '^http.*code\.zip$'; then     # 有参数是 http开头 code.zip结尾     cp /root/code.zip "$8"     has_preset=1 fi 同样的思路, 处理 xray-linux-64.zip, 处理 jq-linux-amd64 再来处理 wget --no-check-certificate -4 -qO- https://one.one.one.one/cdn-cgi/trace 我们要先判断 包含 one.one.one.one 这个特征, 现进行替换. 得到 if printf '%s\n' "$@" | grep -qF 'one.one.one.one'; then   # 有参数是 包含one...

向外访问网络行为次序固定的场景下 预设网络资源 预设替代命令

图片
前言 上一篇 我们实现了 向外访问网络时暂停 使用者进行替代操作 对于这种向外访问网络行为次序固定的场景下  我们可以预设网络资源 预设替代命令 预设网络资源 刚好利用上一篇我们操作过的环境. * 如果你是从头来的话, 基本上就是把上一篇教程操作一遍. 预设替代命令 打开上一篇的操作日志. * Xshell 可以自动记录日志 参考上一篇操作过程中我们输入的替代命令, 设置到 __fake_net_common.sh 中 如, 序号 1 序号 3 序号 5  我们遇到了一个随机字符的问题, 不能写死预设命令. 我们可以用指定第几个参数的方法. 问问GPT 分析下面这样的命令 curl -L -q --retry 5 --retry-delay 10 --retry-max-time 60 -x '' -sSfLo /tmp/tmp.eNF5Sld6Wm -H Accept:\ application/vnd.github.v3+json https://api.github.com/repos/XTLS/Xray-core/releases/latest  "$cmd" 是 curl "$@" 是curl后面所有的参数 我需要用指定第几个参数的方法 提取其中的 /tmp/tmp.eNF5Sld6Wm GPT帮我数了数, 用 "${13}" 的方法引用. __fake_net_common.sh 修改完后. 试试 source fake-curl-wget-v2.sh bash install.sh 有问题, 会卡死. 检查了一下, 是因为在 case 1) 的里面写了 curl. 这里并没有使用系统原本的curl, 而是调用了假的curl. 我们借用之前的经验.  先去掉假的PATH, 执行curl之后, 再恢复假的PATH. 再试试 source fake-curl-wget-v2.sh bash install.sh 还是有问题. 在 cp /root/xxx  yyy 的部分, 报错非法参数. 那我们就把参数 echo 出来. 再根据日志的打印, 对比 curl 原始命令的参数列表, 发现应该用 "${12}" 用这种方式调试完, 就正常了. 小优化 在 /tmp/f...

多shell脚本嵌套调用的环境 向外访问网络时暂停 使用者进行替代操作

图片
前言 上一篇我们将 向外访问网络时暂停 使用者进行替代操作 的方案应用在了 安装233boy 脚本上面 进一步的, 能不能继续拓展应用范围, 用在, 比如, 我自己的 极简一键脚本中? bash <(curl -L https://github.com/crazypeace/xray-vless-reality/raw/main/install.sh) 试试 发现有问题. 我的脚本调用了xray官方安装脚本, 在这个嵌套调用的场景下, 被嵌套调用的脚本里的网络访问就没有被抓到. 去问了好多个GPT, 回答了一堆什么线程啊, 进程啊, 环境啊, 继承啊, ...  给了我几个解决方案, 试了一下也是不行. 说明回答的那些理论就是狗屁. 改进 那就来个根本的方案, 在系统PATH中安插假的 curl 和 wget. 我们上个方案里的 curl, wget, __fake_net_common 函数, 都变成可执行文件, 放到 PATH里去. 逻辑都是现成的, 不用大改. 最终我们得到这样的 4 个脚本 fake-curl-wget-v2.sh #!/usr/bin/env bash # ========================================== # 拦截 curl 和 wget 调用,用于调试/离线测试 # ========================================== # 在PATH中设置假命令 curl wget mkdir -p /tmp/fakebin if [[ ":$PATH:" != *:/tmp/fakebin:* ]]; then   export PATH="/tmp/fakebin:$PATH" fi # 清理调用记数文件 rm /tmp/fakebin/* # 放入假命令文件 cp __fake_net_common.sh /tmp/fakebin/fake_net_common chmod +x $_ cp __fake_curl.sh /tmp/fakebin/curl chmod +x $_ cp __fake_wget.sh /tmp/fakebin/wget chmod +x $_ # -----------------------------...

在网络受限的VPS上 运行一个脚本 向外访问网络时暂停 使用者进行替代操作

图片
前言 上一篇我们解决DD脚本的问题的方案, 其实就可以用来解决所有网络受限的VPS环境运行脚本的问题  ( 当然整个操作看起来比较繁琐. 而且, 上一篇的方案只处理了curl的情况. 而常见的脚本, 有些是用curl访问网络, 有些是用wget. 能力弱一点的朋友, 不知道怎么改成处理wget的情况. 那么, 我们尝试做一个通用一点的方案. 而且考虑如何方便使用. 思路 我们 做一个 fake-curl-wget.sh 脚本. 1) fake-curl-wget.sh 包含一个 curl() 的壳子, 和一个 wget() 的壳子 2) 使用者在终端先 source fake-curl-wget.sh 再执行其它脚本 3) 这样, 后面执行的脚本会调用到 fake-curl-wget.sh 中的 curl()壳子 和 wget()壳子 4) 每次调用 curl 或 wget 时, 打印一个调用序号. 这个序号每次调用时, 自增1 为了避免管道命令导致的序号问题, 使用临时文件保存序号. 5) 对于所有 curl 和 wget 调用, 这个序号是统一.  先调用curl时, 序号为1. 接着调用wget时, 序号为2. 6) 输出 pwd 当前目录 7) 输出 完整的 curl 命令和全部参数 8) 输出 完整的 wget 命令和全部参数 9) 这个curl壳 或 wget壳, 并不去真正访问网络 10) 根据调用序号, 执行预设的命令. 如, cp file1 /path/to/file 或 cat file2 用来替代 curl -LO 或 curl -Lo 的保存文件的命令 或 curl -L 的输出到stdout的命令 11) 这些预设命令是会被人工编辑而增加的. 用case实现 10) 的逻辑. 12) 这个curl壳 或 wget壳, 永远返回成功. 实践与调试 把上面这一大段需求发给GPT. 得到的结果大方向是对的, 但是有小问题. 而且对话几次, 也不能让我满意. 还是要动用我的编码能力, 综合多个GPT的回答. * 也许是我用的免费的GPT, 能力不够. 版本V1 最终得到 fake-curl-wget.sh 文件内容: #!/usr/bin/env bash # ============================...

DD脚本 在日志输出curl被调用的序号 输出curl命令和参数 执行预设的命令

图片
前言 在 DD脚本群 https://t.me/reinstall_os 有群友遇到网络不好, 脚本下载资源时容易中断的问题. 思路 上一篇我们发现不能简单的将某个资源提前放到VPS指定的位置 因为会出现 不同的资源 放到VPS上同一个位置的情况. 那么我们换个思路. 在整个脚本的执行过程中, 所有的curl命令的内容和次序是固定的. 换句话说, 我们每次执行脚本时, 第1句, 第2句, 第3句, ... 第n句curl命令的内容是固定的. 哪怕脚本中某一条curl语句被放在了循环中, 被执行了多次. 但是从展开后的执行序列来说, 每次curl命令的内容是固定的. 实践 所以我们 在已有的脚本头部添加一个这样的curl壳子: 1) 记录并打印一个调用序号. 每次调用序号增1 2) 输出 pwd 当前目录 3) 输出完整的 curl 命令及全部参数 4) 这个curl壳, 并不去真正下载文件. 5) 根据调用序号, 执行预设的命令. 如,  cp file1 /path/to/file 或 cat file2 来替代 curl -LO 或 curl  -Lo 的保存文件的命令 或 curl -L 的输出到stdout的命令 6) 这些预设命令是会被人工编辑而增加的. 用case实现 5) 的逻辑. 7) 这个curl壳, 永远返回成功.  把这个要求发给GPT, 得到 # 全局调用计数器 curl_call_count=0 curl() {     curl_call_count=$((curl_call_count + 1))     # 输出调用序号和当前目录(到 stderr)     echo "[DEBUG] curl call # $curl_call_count" >&2     echo "[DEBUG] Current directory: $(pwd)" >&2     # 输出完整命令(包含所有参数,安全转义)     printf '[DEBUG] Command: curl ' >&2     printf '%q ' "$@" ...

DD脚本 输出所需资源的链接

图片
前言 在 DD脚本群 https://t.me/reinstall_os 有群友遇到网络不好, 脚本下载资源时容易中断的问题. 思路 我有一个想法,  1) 让这个脚本把所有需要下载的资源的链接输出 2) 使用者自己去下载资源, 并上传到VPS上 实践 分析一下这个DD脚本 https://github.com/bin456789/reinstall/raw/refs/heads/main/reinstall.sh 在脚本的开头, 看到作者已经实现了一个 curl 函数, 用于包装系统的curl. 这是一个很好的思路. 我们可以在此基础上, 作如下修改: 1. 输出 pwd 当前目录 2. 输出完整的 curl 命令及全部参数 3. 这个curl壳, 并不去真正下载文件. 4. 这个curl壳, 永远返回成功. 拿着这些去问GPT. 最终修改成这样: curl() {     # 输出当前工作目录     echo "[DEBUG] Current directory: $(pwd)" >&2     # 输出完整命令(含全部参数)     printf 'curl ' >&2     printf '%q ' "$@" >&2     printf '\n' >&2     echo >&2     # 不执行真实下载,只打印信息     # 永远返回成功     return 0 } 我们把修改过的 reinstall-edited.sh 上传到 VPS, 测试 bash reinstall-edited.sh debian 13 *  debian 13  为示例. 日志打印为: [DEBUG] Current directory: /root curl -L http://www.qualcomm.cn/cdn-cgi/trace 我们在脚本中搜索  http://www.qualcomm.cn/cdn-cgi/trace 找到如下代码 我们需要让此处的...

The Hot3 in Last 30 Days

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks

搭 Docker版 Sub-Store订阅转换专家 带 http-meta 实现 集合订阅 测延迟 排序 筛选 生成新订阅 定时任务上传Gist