GOLANG实现的HTTP转HTTPS的代理

参考gocn

有时候需要将后端的HTTP服务,转成HTTPS,可以用一个代理。

Reamark: 如果是GOLANG的后端服务,可以直接用库go-oryx-lib/https

这个代理支持自签名的证书,也支持letsencrypt的证书。

Remark: Letsencrypt只支持少量域名的情况,比如自己的网站,它会有请求次数限制,另外CA是letsencrypt的,商业用户不适合用。

我们有个HTTP API, SRS Version:

{
  "code": 0,
  "server": 12504,
  "data": {
    "major": 2,
    "minor": 0,
    "revision": 243,
    "version": "2.0.243"
  }
}

下面演示实现HTTPS的代理。

Self-sign Certificate

自签名证书可以用在测试中,先生成私钥server.key和证书server.crt

openssl genrsa -out server.key 2048 &&
openssl req -new -x509 -key server.key -out server.crt -days 365

Remark: 生成证书时会有很多提问,直接回车就好了。还可以参考openssl的文档,直接在命令行设置这些参数。

生成私钥和证书后,下载HTTPS代理:

go get github.com/ossrs/go-oryx/httpx-static

Remark: GOLANG的设置请参考GO环境配置

Note: 详细参数可以直接运行httpx-static程序不带参数,会显示help。

启动服务,代理到SRS Version:

sudo $GOPATH/bin/httpx-static -http 80 -https 443 \
    -proxy http://ossrs.net:1985/api/v1/versions \
    -ssc server.crt -ssk server.key

访问本机HTTP和HTTPS就可以:

  1. HTTP: http://localhost/api/v1/versions
  2. HTTPS: https://localhost/api/v1/versions

Remark: 浏览器访问自签名证书时,可能会提示不安全,选择高级然后继续浏览就可以了。

LetsEncrypt Certificate

可以使用letsencrypt签名的证书,在浏览器中会显示合法的绿色,不会提示有错误。参考:ossrs.net

ossrs.net也是使用httpx-static,参数如下:

sudo $GOPATH/bin/httpx-static -http 80 -https 443 \
    -lets=true -domains ossrs.net

Remark: 注意在局域网的机器无法使用,因为ACME会有反向验证,也就是你的服务器得能在公网访问到。

Advance Proxy

如果需要代理所有的API怎么办呢?直接指定父目录就好,如果指定/则代理所有的请求。例如:

下面的命令,代理所有的/api请求:

sudo $GOPATH/bin/httpx-static -http 80 -https 443 \
    -proxy http://ossrs.net:1985/api \
    -ssc server.crt -ssk server.key

下面的命令,代理所有的请求,相当于做了镜像:

sudo $GOPATH/bin/httpx-static -http 80 -https 443 \
    -proxy http://ossrs.net/ \
    -ssc server.crt -ssk server.key

其他的参数请参考httpx-static的参数。

发布了247 篇原创文章 · 获赞 95 · 访问量 87万+
展开阅读全文

golang:如何使用代理执行https请求

03-08

<div class="post-text" itemprop="text"> <p>I am able to do a http or https client request without setting up a proxy, </p> <pre><code>enter code here tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{} client.Transport = tr request, err := http.NewRequest("HEAD", "http://www.???.com", nil) request.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36") resp, err := client.Do(request) if err != nil { log.Fatalln(err) return } defer resp.Body.Close() httpcode = resp.Status </code></pre> <p>This script is working ok, I get a 200 ok when I request https url, but if I set up proxy , the script:</p> <pre><code>proxyString := "https://47.91.179.xxx:443" proxyUrl, _ := url.Parse(proxyString) tr := &http.Transport{ Proxy: http.ProxyURL(proxyUrl), TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{} client.Transport = tr .................... </code></pre> <p>I always get "Bad request", I read docs: <a href="https://golang.org/pkg/net/http/" rel="nofollow noreferrer">https://golang.org/pkg/net/http/</a>:</p> <p>........... Starting with Go 1.6, the http package has transparent support for the HTTP/2 protocol when using HTTPS. Programs that must disable HTTP/2 can do so by setting Transport.TLSNextProto (for clients) or Server.TLSNextProto (for servers) to a non-nil, empty map. Alternatively, the following GODEBUG environment variables are currently supported: ..............</p> <p>So, I tried to stop http2:</p> <pre><code>tr := &http.Transport{ Proxy: http.ProxyURL(proxyUrl), //Proxy: http.ProxyFromEnvironment, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, TLSNextProto: make(map[string]func(authority string, c *tls.Conn) http.RoundTripper), } </code></pre> <p>same problem, "Bad request". I tried os.Setenv("HTTPS_PROXY", "47.91.???.???:443"), It is the same result. This is logged in server:</p> <pre><code>{S;}220.255.95.68{S;}-{S;}07/Mar/2017:17:01:47 +0800{S;}CONNECT www.panpacific.com:443 HTTP/1.1{S;}400{S;}173{S;}340{S;}-{S;}-{S;}-{S;}-{S;}-{S;}www.panpacific.com </code></pre> <p>So, Does golang support https client request via proxy? How do I get correct results?</p> </div> 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览