内网 nginx 做反代,自签 CA 和域名证书,在 win 上装自签 CA 没问题,但手机没办法装,完全解决不了。

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

所以有没有这种东西呢?

手机也可以安装自签名证书哦 具体看各种抓包工具 例如 whistle
各种协议转发工具 可以看这款 latest.gost.run/tutorials/reverse-proxy/

https 自签 转 http, 用 nginx 反代一个 http 协议的就行

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

没懂你的场景是什么

你反代的网站访问不了是因为浏览器不认你的证书。 根 http socks 代理无任何关系。 你不解决证书信任或者把 https 反代成 http 套几层 socks 都没用

手机上的各方法我早试过了,都不行,只能放弃。

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

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

但现在:我手机→ http/socks 代理转 http 协议→nginx 反代→目标网站。

我目标就是 http/socks 代理转 http 协议,不是 https ,nginx 的 http 反代 https 早测试过了,没问题。

手机为什么不能装,我现在就装的是啊?(
可能你指的是 android 后面版本部分应用不信任用户态的 CA ,只信任 System CA?

为什么不换个思路,在内网用公网域名+公网证书?

stunnel 可以将 https 转成 http

用 clash 就好了啊

不理解 , 反代了 http 加不加 s 不是 nginx 配置的事情吗

感觉你是搞了个简陋的 vless+reality 协议。

v2ray 的 routing 功能,可以进行各种协议的桥接。

https 是短链接,socks 是长连接,这个结构导致了你要的长连接转为短链接 ,已经不可能实现

proxychain 或者 tun2socks ?

我也不太懂
手机->nginx 如果只是内网访问,不配置证书不就完事了?现在配了自签证书又想转 http 不就多此一举了?

我觉得有一种可能是此 nginx 不是他能控制的。否则就和你说的一样,多此一举。

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

如果这都不满足,我觉得是你没有把原始需求说明白,又或者是个 YX 问题

你需要的是 socat

可以的,但是需要自定义代理服务器。似乎没有现成的正向代理服务器支持这种。

socat TCP4-LISTEN:<本地端口>,reuseaddr,fork PROXY:<代理服务器 IP>:<远程地址>:<远程端口>,proxyport=<代理服务器端口>
适用于 http proxy

这样访问<本地端口>,效果就是穿过 http 代理的<远程端口>

#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)
}

gost