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

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

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

所以有没有这种东西呢?
3668 次点击
所在节点    Web Dev
37 条回复
rkonfj
39 天前
@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
39 天前
gost
scegg
39 天前
如果访问通路存在,安全性报错的话,可能最简单的办法是买个域名,并通过 acme.sh 配置 DNS 验证来获得 SSL 证书。
ztjal
39 天前
这个问题搞来搞去就回到像 3 楼说的证书问题,这关过不了。

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

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

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

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

自签 CA 分别用 openssl 和 xca 生成,都试过,结果一样。
samIIsun
39 天前
@ztjal 我 ios ,都可以安装的自签 ca ,并访问内网 ng( https 服务),安卓阵营怎么会不行嘞。
psllll
39 天前
如果是在局域网下,可以用 hosts 功能,先拿到 ssl 证书,hosts 让域名指向 nginx 服务器上,填 ssl 证书路径,这样你用域名访问就有 https 了,而且默认信任域名证书不需要自签
samIIsun
39 天前
@ztjal 看到你提到的证书格式 pfx ,是否由于安卓对证书格式的要求导致的导入失败。
“在 Android 设备安装 CA 的步骤:
1. 保证根 CA 是 PEM 或 DER 的文件格式,并且扩展名为 .crt 。如果需要,进行转换。”
引用自: https://support.hcl-software.com/csm?id=kb_article&sysparm_article=KB0098688
yougg
39 天前
不是自己购买的域名吗?, 是的话 LetsEncrypt 签证书很容易吧.
ztjal
39 天前
@psllll
域名不是我的,需然可以从浏览器下载域名的证书,但没 KEY (有才怪),根本不能配置,nginx 启动不。
ztjal
39 天前
@yougg
是自己的就没这么多问题了。😎
ztjal
39 天前
@samIIsun
这个方法只有在旧版的安卓才行。
psllll
38 天前
@ztjal 自己买一个或者找免费域名白嫖
ztjal
38 天前
@psllll
这个不是买域名的问题,而且人家的域名价值不可估计,我一介凡夫俗子买不起。
mohumohu
38 天前
这不就用 sniproxy 就好了,搞这么复杂
psllll
38 天前
@ztjal 我的意思是你用域名证书替代你自签的证书,然后直接用域名访问,通过 hosts 劫持到局域网 ip 里的 nginx 。
szdosar
38 天前
简单讲,你希望外网访问内网 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
38 天前
nginx 那边不要 https 不就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/1128755

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX