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

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

  •  
  •   ztjal · 1 天前 · 2688 次点击
    内网 nginx 做反代,自签 CA 和域名证书,在 win 上装自签 CA 没问题,但手机没办法装,完全解决不了。

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

    所以有没有这种东西呢?
    36 条回复    2025-04-30 13:43:24 +08:00
    xfewpi
        1
    xfewpi  
       1 天前
    手机也可以安装自签名证书哦 具体看各种抓包工具 例如 whistle

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

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

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

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

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

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

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


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

    适用于 http proxy

    这样访问<本地端口>,效果就是穿过 http 代理的<远程端口>
    rkonfj
        21
    rkonfj  
       1 天前
    @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  
       1 天前
    gost
    scegg
        23
    scegg  
       1 天前
    如果访问通路存在,安全性报错的话,可能最简单的办法是买个域名,并通过 acme.sh 配置 DNS 验证来获得 SSL 证书。
    ztjal
        24
    ztjal  
    OP
       22 小时 58 分钟前
    这个问题搞来搞去就回到像 3 楼说的证书问题,这关过不了。

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

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

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

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

    自签 CA 分别用 openssl 和 xca 生成,都试过,结果一样。
    samIIsun
        25
    samIIsun  
       22 小时 28 分钟前
    @ztjal 我 ios ,都可以安装的自签 ca ,并访问内网 ng( https 服务),安卓阵营怎么会不行嘞。
    psllll
        26
    psllll  
       22 小时 24 分钟前
    如果是在局域网下,可以用 hosts 功能,先拿到 ssl 证书,hosts 让域名指向 nginx 服务器上,填 ssl 证书路径,这样你用域名访问就有 https 了,而且默认信任域名证书不需要自签
    samIIsun
        27
    samIIsun  
       22 小时 23 分钟前
    @ztjal 看到你提到的证书格式 pfx ,是否由于安卓对证书格式的要求导致的导入失败。
    “在 Android 设备安装 CA 的步骤:
    1. 保证根 CA 是 PEM 或 DER 的文件格式,并且扩展名为 .crt 。如果需要,进行转换。”
    引用自: https://support.hcl-software.com/csm?id=kb_article&sysparm_article=KB0098688
    yougg
        28
    yougg  
       22 小时 18 分钟前
    不是自己购买的域名吗?, 是的话 LetsEncrypt 签证书很容易吧.
    ztjal
        29
    ztjal  
    OP
       20 小时 33 分钟前
    @psllll
    域名不是我的,需然可以从浏览器下载域名的证书,但没 KEY (有才怪),根本不能配置,nginx 启动不。
    ztjal
        30
    ztjal  
    OP
       20 小时 33 分钟前
    @yougg
    是自己的就没这么多问题了。😎
    ztjal
        31
    ztjal  
    OP
       20 小时 27 分钟前
    @samIIsun
    这个方法只有在旧版的安卓才行。
    psllll
        32
    psllll  
       15 小时 41 分钟前
    @ztjal 自己买一个或者找免费域名白嫖
    ztjal
        33
    ztjal  
    OP
       14 小时 45 分钟前
    @psllll
    这个不是买域名的问题,而且人家的域名价值不可估计,我一介凡夫俗子买不起。
    mohumohu
        34
    mohumohu  
       8 小时 34 分钟前
    这不就用 sniproxy 就好了,搞这么复杂
    psllll
        35
    psllll  
       5 小时 6 分钟前
    @ztjal 我的意思是你用域名证书替代你自签的证书,然后直接用域名访问,通过 hosts 劫持到局域网 ip 里的 nginx 。
    szdosar
        36
    szdosar  
       2 小时 36 分钟前
    简单讲,你希望外网访问内网 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}'
    '''
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5131 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:19 · PVG 16:19 · LAX 01:19 · JFK 04:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.