douguan3470 2013-04-22 10:31
浏览 7

如何在客户端中处理https(record_too_long错误)

I'm building proxy and i'd like to handle https urls also.
The problem is that i get error when i try to access https://google.com

SSL  received a record that exceeded the maximum permissible length.
(Error code: ssl_error_rx_record_too_long)

The code for my proxy is this:

package main

import (
    "crypto/tls"
    "flag"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "unicode"
)

var (
    listen = flag.String("listen", "localhost:1080", "listen on address")
    logp   = flag.Bool("log", true, "enable logging")
)

func main() {
    flag.Parse()
    proxyHandler := http.HandlerFunc(proxyHandlerFunc)

    log.Fatal(http.ListenAndServe(*listen, proxyHandler))

    //log.Fatal(http.ListenAndServeTLS("localhost:1080", "cert.pem","key.pem",proxyHandler))

}
func copyHeaders(dst, src http.Header) {
    for k, _ := range dst {
        dst.Del(k)
    }
    for k, vs := range src {
        for _, v := range vs {
            dst.Add(k, v)
        }
    }
}

func proxyHandlerFunc(w http.ResponseWriter, r *http.Request) {
    log.Println(r.Method)

    if r.Method == "CONNECT" && 1 == 2 {

    } else {
        // Log if requested
        if *logp {
            log.Println(r.URL)
        }

        tr := &http.Transport{
            TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
        }

        // We'll want to use a new client for every request.
        client := &http.Client{Transport: tr}

        // Tweak the request as appropriate:
        //  RequestURI may not be sent to client
        //  URL.Scheme must be lower-case
        r.RequestURI = ""

        r.URL.Scheme = strings.Map(unicode.ToLower, r.URL.Scheme)
        if r.URL.Scheme == "" {
            r.URL.Scheme = "https"
        }
        log.Println(r.Host)

        // And proxy
        resp, err := client.Do(r)
        if err != nil {
            log.Fatal(err)

        }
        for n, v := range resp.Header {
            log.Printf("%s %s", n, v[0])
        }

        bodyBytes, err := ioutil.ReadAll(resp.Body)
        resp.Body.Close()

        copyHeaders(w.Header(), resp.Header)

        w.Write(bodyBytes)

        log.Print("----------")

    }
}

Code above work for the normal urls (http), what i should do to get https urls also?

EDIT: I updated the code.

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 echarts动画效果失效的问题。官网下载的例子。
    • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
    • ¥15 Attention is all you need 的代码运行
    • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
    • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
    • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
    • ¥30 关于<main>标签页面跳转的问题
    • ¥80 部署运行web自动化项目
    • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
    • ¥30 VMware 云桌面水印如何添加