V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ztjal
V2EX  ›  Web Dev

有没一种可以将 http/socks 代理转 http 协议的东西?

  •  
  •   ztjal · 2025 年 4 月 29 日 · 5383 次点击
    这是一个创建于 265 天前的主题,其中的信息可能已经有所发展或是发生改变。
    内网 nginx 做反代,自签 CA 和域名证书,在 win 上装自签 CA 没问题,但手机没办法装,完全解决不了。

    现在想的就是用一个 http/socks 代理,将流量转成 http 协议,来访问 nginx 。

    所以有没有这种东西呢?
    37 条回复    2025-04-30 16:32:12 +08:00
    xfewpi
        1
    xfewpi  
       2025 年 4 月 29 日
    手机也可以安装自签名证书哦 具体看各种抓包工具 例如 whistle

    各种协议转发工具 可以看这款 https://latest.gost.run/tutorials/reverse-proxy/
    w88975
        2
    w88975  
       2025 年 4 月 29 日
    https 自签 转 http, 用 nginx 反代一个 http 协议的就行

    你手机上访问你的自签域名, 本质还是走的 https 协议, 你加个代理, 无非就是 MIT 绕过证书校验, 还是得走 https 啊

    没懂你的场景是什么
    009694
        3
    009694  
       2025 年 4 月 29 日 via iPhone
    你反代的网站访问不了是因为浏览器不认你的证书。 根 http socks 代理无任何关系。 你不解决证书信任或者把 https 反代成 http 套几层 socks 都没用
    ztjal
        4
    ztjal  
    OP
       2025 年 4 月 29 日
    @xfewpi
    手机上的各方法我早试过了,都不行,只能放弃。
    ztjal
        5
    ztjal  
    OP
       2025 年 4 月 29 日
    @w88975

    最理想的:我手机→nginx 反代→目标网站,解决。

    因手机实在没办法装自签 CA 证书(反正网上找得到的办法我都试过了)。

    但现在:我手机→ http/socks 代理转 http 协议→nginx 反代→目标网站。
    ztjal
        6
    ztjal  
    OP
       2025 年 4 月 29 日
    @009694
    我目标就是 http/socks 代理转 http 协议,不是 https ,nginx 的 http 反代 https 早测试过了,没问题。
    derdct
        7
    derdct  
       2025 年 4 月 29 日 via Android
    手机为什么不能装,我现在就装的是啊?(
    可能你指的是 android 后面版本部分应用不信任用户态的 CA ,只信任 System CA?
    383394544
        8
    383394544  
       2025 年 4 月 29 日 via iPhone
    为什么不换个思路,在内网用公网域名+公网证书?
    yinmin
        9
    yinmin  
       2025 年 4 月 29 日 via iPhone
    stunnel 可以将 https 转成 http
    yuchenr
        10
    yuchenr  
       2025 年 4 月 29 日
    用 clash 就好了啊
    sks4728
        11
    sks4728  
       2025 年 4 月 29 日   ❤️ 2
    不理解 , 反代了 http 加不加 s 不是 nginx 配置的事情吗
    lifei6671
        12
    lifei6671  
       2025 年 4 月 29 日
    感觉你是搞了个简陋的 vless+reality 协议。
    BenjaminSu
        13
    BenjaminSu  
       2025 年 4 月 29 日
    v2ray 的 routing 功能,可以进行各种协议的桥接。
    opengps
        14
    opengps  
       2025 年 4 月 29 日
    https 是短链接,socks 是长连接,这个结构导致了你要的长连接转为短链接 ,已经不可能实现
    0x5c0f
        15
    0x5c0f  
       2025 年 4 月 29 日
    proxychain 或者 tun2socks ?
    BreadKiller
        16
    BreadKiller  
       2025 年 4 月 29 日
    我也不太懂
    手机->nginx 如果只是内网访问,不配置证书不就完事了?现在配了自签证书又想转 http 不就多此一举了?
    Judoon
        17
    Judoon  
       2025 年 4 月 29 日
    @BreadKiller 我觉得有一种可能是此 nginx 不是他能控制的。否则就和你说的一样,多此一举。

    另外 @楼主,如果如我上面猜测的话,你再起一个你的 nginx 监听 http 端口, proxy_pass https://<old_nginx> 然后 ignore 证书就行了。


    如果这都不满足,我觉得是你没有把原始需求说明白,又或者是个 YX 问题
    busier
        18
    busier  
       2025 年 4 月 29 日 via iPhone
    你需要的是 socat
    rkonfj
        19
    rkonfj  
       2025 年 4 月 29 日 via iPhone
    可以的,但是需要自定义代理服务器。似乎没有现成的正向代理服务器支持这种。
    busier
        20
    busier  
       2025 年 4 月 29 日 via iPhone
    socat TCP4-LISTEN:<本地端口>,reuseaddr,fork PROXY:<代理服务器 IP>:<远程地址>:<远程端口>,proxyport=<代理服务器端口>

    适用于 http proxy

    这样访问<本地端口>,效果就是穿过 http 代理的<远程端口>
    rkonfj
        21
    rkonfj  
       2025 年 4 月 29 日
    @rkonfj #19 这是一个用 Go 实现的简单代 http 理服务器,把所有 http 请求都代理到 backend (可以设置你自签 CA 的 https 服务器)
    ```
    package main

    import (
    "crypto/tls"
    "crypto/x509"
    "flag"
    "net/http"
    "net/http/httputil"
    "net/url"
    "os"
    )

    var (
    backend string
    caPath string
    )

    func main() {
    flag.StringVar(&backend, "backend", "", "server URL")
    flag.StringVar(&caPath, "ca", "", "ca certificate path")
    flag.Parse()

    backendURL, _ := url.Parse(backend)
    caCertPool, _ := x509.SystemCertPool()

    if caPath != "" {
    caCert, err := os.ReadFile(caPath)
    if err != nil {
    panic(err)
    }

    if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {
    panic("append CA failed")
    }
    }

    rp := httputil.NewSingleHostReverseProxy(backendURL)
    rp.Transport = &http.Transport{
    TLSClientConfig: &tls.Config{
    RootCAs: caCertPool,
    ServerName: backendURL.Hostname(),
    },
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    r.Header.Del("Proxy-Connection")
    r.Host = backendURL.Host
    rp.ServeHTTP(w, r)
    })
    http.ListenAndServe(":3080", nil)
    }
    ```
    chaodada
        22
    chaodada  
       2025 年 4 月 29 日
    gost
    scegg
        23
    scegg  
       2025 年 4 月 29 日
    如果访问通路存在,安全性报错的话,可能最简单的办法是买个域名,并通过 acme.sh 配置 DNS 验证来获得 SSL 证书。
    ztjal
        24
    ztjal  
    OP
       2025 年 4 月 29 日
    这个问题搞来搞去就回到像 3 楼说的证书问题,这关过不了。

    我自签 CA ,再用 CA 签域名。

    在 WIN 和 DEBIAN 上装自签 CA 都没问题。就安卓不行。

    一台安卓 10 MIUI11 ,有 ROOT ,用面具刷证书模块,但没见到系统证书里出现。

    一台安卓 13 MIUI14 ,没 ROOT ,装自签 CA 生成的 pfx ,揭示“无法将此文件用作 CA 证书”。

    自签 CA 分别用 openssl 和 xca 生成,都试过,结果一样。
    samIIsun
        25
    samIIsun  
       2025 年 4 月 29 日
    @ztjal 我 ios ,都可以安装的自签 ca ,并访问内网 ng( https 服务),安卓阵营怎么会不行嘞。
    psllll
        26
    psllll  
       2025 年 4 月 29 日
    如果是在局域网下,可以用 hosts 功能,先拿到 ssl 证书,hosts 让域名指向 nginx 服务器上,填 ssl 证书路径,这样你用域名访问就有 https 了,而且默认信任域名证书不需要自签
    samIIsun
        27
    samIIsun  
       2025 年 4 月 29 日
    @ztjal 看到你提到的证书格式 pfx ,是否由于安卓对证书格式的要求导致的导入失败。
    “在 Android 设备安装 CA 的步骤:
    1. 保证根 CA 是 PEM 或 DER 的文件格式,并且扩展名为 .crt 。如果需要,进行转换。”
    引用自: https://support.hcl-software.com/csm?id=kb_article&sysparm_article=KB0098688
    yougg
        28
    yougg  
       2025 年 4 月 29 日
    不是自己购买的域名吗?, 是的话 LetsEncrypt 签证书很容易吧.
    ztjal
        29
    ztjal  
    OP
       2025 年 4 月 29 日
    @psllll
    域名不是我的,需然可以从浏览器下载域名的证书,但没 KEY (有才怪),根本不能配置,nginx 启动不。
    ztjal
        30
    ztjal  
    OP
       2025 年 4 月 29 日
    @yougg
    是自己的就没这么多问题了。😎
    ztjal
        31
    ztjal  
    OP
       2025 年 4 月 29 日
    @samIIsun
    这个方法只有在旧版的安卓才行。
    psllll
        32
    psllll  
       2025 年 4 月 30 日
    @ztjal 自己买一个或者找免费域名白嫖
    ztjal
        33
    ztjal  
    OP
       2025 年 4 月 30 日
    @psllll
    这个不是买域名的问题,而且人家的域名价值不可估计,我一介凡夫俗子买不起。
    mohumohu
        34
    mohumohu  
       2025 年 4 月 30 日
    这不就用 sniproxy 就好了,搞这么复杂
    psllll
        35
    psllll  
       2025 年 4 月 30 日
    @ztjal 我的意思是你用域名证书替代你自签的证书,然后直接用域名访问,通过 hosts 劫持到局域网 ip 里的 nginx 。
    szdosar
        36
    szdosar  
       2025 年 4 月 30 日
    简单讲,你希望外网访问内网 web 服务?假设你的服务器是 linux 且按照了 cloudflared ,web 服务端口是 8080
    '''
    sudo cloudflared tunnel --url http://localhost:8080 --edge-ip-version auto --no-autoupdate --protocol http2 > ~/argo.log 2>&1 &
    ps aux | grep cloudflared | grep tunnel | grep 8080
    cat ~/argo.log 2>/dev/null | grep -a trycloudflare.com | awk 'NR==2{print}' | awk -F// '{print $2}' | awk '{print $1}'
    '''
    yc8332
        37
    yc8332  
       2025 年 4 月 30 日
    nginx 那边不要 https 不就好了。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5984 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 01:57 · PVG 09:57 · LAX 17:57 · JFK 20:57
    ♥ Do have faith in what you're doing.