Jadual Kandungan
Kandungan soalan
Penyelesaian
Rumah pembangunan bahagian belakang Golang Cara membetulkan proxyconnect tcp: tls: rekod pertama tidak kelihatan seperti jabat tangan TLS

Cara membetulkan proxyconnect tcp: tls: rekod pertama tidak kelihatan seperti jabat tangan TLS

Feb 11, 2024 am 10:18 AM

如何修复 proxyconnect tcp: tls: 第一条记录看起来不像 TLS 握手

Editor PHP Apple di sini untuk membawakan anda penyelesaian kepada masalah "proxyconnect tcp: tls: rekod pertama tidak kelihatan seperti jabat tangan TLS". Ralat ini biasanya berlaku apabila menggunakan pelayan proksi dan boleh menyebabkan masalah sambungan rangkaian. Sebelum kita dapat menyelesaikan masalah ini, kita perlu memahami punca masalah tersebut. Dengan langkah mudah berikut, kami akan menunjukkan kepada anda cara untuk menyelesaikan masalah ini untuk memastikan sambungan rangkaian anda berfungsi dengan baik.

Kandungan soalan

Dalam Cara menggunakan REST API dalam Go, kod contoh yang berfungsi sepenuhnya disediakan untuk memanggil API REST awam. Tetapi jika saya mencuba contoh saya mendapat ralat ini:

error getting cat fact: 
      Get "https://catfact.ninja/fact": 
      proxyconnect tcp: tls: first record does not look like a TLS handshake
Salin selepas log masuk

Dokumentasi pada status http

<code>
For control over proxies, TLS configuration, keep-alives, compression, and other settings, create a Transport:
</code>
Salin selepas log masuk

Dan dokumen pemindahan:

<code>    // DialContext specifies the dial function for creating unencrypted TCP connections.
    // If DialContext is nil (and the deprecated Dial below is also nil),
    // then the transport dials using package net.
    //
    // DialContext runs concurrently with calls to RoundTrip.
    // A RoundTrip call that initiates a dial may end up using
    // a connection dialed previously when the earlier connection
    // becomes idle before the later DialContext completes.
    DialContext func(ctx context.Context, network, addr string) (net.Conn, error)
</code>
Salin selepas log masuk

Jadi saya menganggap saya perlu mengkonfigurasi Konteks Dail untuk membolehkan sambungan tidak selamat daripada klien ke proksi without TLS. Tetapi saya tidak tahu bagaimana untuk melakukannya. Baca ini:

  • Cara membuat proksi dan TLS dalam golang;
  • Cara melakukan HTTP/HTTPS GET melalui proksi; dan
  • Bagaimana untuk melaksanakan permintaan https dengan sijil yang salah?

Tidak membantu juga. Ada yang mengalami ralat yang sama proxyconnect tcp: tls:first record does not Look like a TLS handshake dan terangkan sebabnya:

<code>
This is because the proxy answers with an plain HTTP error to the strange HTTP request (which is actually the start of the TLS handshake).
</code>
Salin selepas log masuk

Tetapi balasan Steffen tidak mempunyai kod contoh tentang cara menyediakannya DialContext func(ctx context.Context, network, addr string),Bogdan和cyberdelia都建议设置tls.Config{InsecureSkipVerify: true}, contohnya seperti ini < /p>

<code>    tr := &http.Transport{
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    }
    client := &http.Client{Transport: tr}
</code>
Salin selepas log masuk

Tetapi perkara di atas tiada kesan. Saya masih mendapat ralat yang sama. dan sambungan masih memanggil https://* 而不是 http://*

Ini adalah contoh kod, saya cuba memasukkan cadangan di atas dan menyesuaikannya:

<code>var tr = &http.Transport{ TLSClientConfig: 
                           &tls.Config{InsecureSkipVerify: true}, } 
                           // lacks DialContext config
var client*  http.Client = &http.Client{Transport: tr} // modified * added
// var client *http.Client // code from tutorial

type CatFact struct {
    Fact   string `json:"fact"`
    Length int    `json:"length"`
}

func GetCatFact() {
    url := "http://catfact.ninja/fact" // changed from https to http
    var catFact CatFact

    err := GetJson(url, &catFact)
    if err != nil {
        fmt.Printf("error getting cat fact: %s\n", err.Error())
    } else {
        fmt.Printf("A super interesting Cat Fact: %s\n", catFact.Fact)
    }
}

func main() {
    client = &http.Client{Timeout: 10 * time.Second}
    GetCatFact()
    // same error 
    // proxyconnect tcp: tls: first record does 
    //                   not look like a TLS handshake
    // still uses https 
    // for GET catfact.ninja
}
</code>
Salin selepas log masuk

Bagaimana untuk mengkonfigurasi sambungan untuk menggunakan sambungan yang tidak disulitkan daripada Pelanggan saya ke pelayan melalui proksi? Adakah tetapan DialContext func(ctx context.Context, network, addr string) membantu dengan ini? apa yang perlu dilakukan

Penyelesaian

Saya baru mencuba:

package main

import (
    "context"
    "crypto/tls"
    "encoding/json"
    "fmt"
    "net"
    "net/http"
    "time"
)

type CatFact struct {
    Fact   string `json:"fact"`
    Length int    `json:"length"`
}

// Custom dialing function to handle connections
func customDialContext(ctx context.Context, network, addr string) (net.Conn, error) {
    conn, err := net.Dial(network, addr)
    return conn, err
}

// Function to get a cat fact
func GetCatFact(client *http.Client) {
    url := "https://catfact.ninja/fact"  // Reverted back to https
    var catFact CatFact

    err := GetJson(url, &catFact, client)
    if err != nil {
        fmt.Printf("error getting cat fact: %s\n", err.Error())
    } else {
        fmt.Printf("A super interesting Cat Fact: %s\n", catFact.Fact)
    }
}

// Function to send a GET request and decode the JSON response
func GetJson(url string, target interface{}, client *http.Client) error {
    resp, err := client.Get(url)
    if err != nil {
        return fmt.Errorf("error sending GET request: %w", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return fmt.Errorf("received non-OK HTTP status: %d", resp.StatusCode)
    }

    err = json.NewDecoder(resp.Body).Decode(target)
    if err != nil {
        return fmt.Errorf("error decoding JSON response: %w", err)
    }

    return nil
}

func main() {
    // Create a custom Transport with the desired settings
    tr := &http.Transport{
        Proxy: http.ProxyFromEnvironment,  // Use the proxy settings from the environment
        DialContext: customDialContext,    // Use the custom dialing function
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,  // Skip certificate verification (not recommended in production)
        },
    }

    // Create a new HTTP client using the custom Transport
    client := &http.Client{
        Transport: tr,
        Timeout:   10 * time.Second,
    }

    // Call the function to get a cat fact
    GetCatFact(client)
}
Salin selepas log masuk

Ia termasuk:

  • Fungsi dailan tersuaicustomDialContext:
    Fungsi ini pada masa ini merupakan pembalut ringkas net.Dial , tetapi ia menyediakan tempat untuk memperkenalkan logik dailan tersuai jika perlu. Ia digunakan sebagai fungsi pendailan tersuai untuk membuat sambungan rangkaian.

  • Konfigurasi penghantaran:

    • Kod yang diubah suai disesuaikan http.Transport dengan konfigurasi tetapan khusus, termasuk fungsi dailan tersuai, tetapan proksi dalam persekitaran dan konfigurasi TLS yang melangkau pengesahan sijil (untuk ujian).
    • Kod asal juga cuba mengkonfigurasi http.Transport tersuai, tetapi hanya menyertakan konfigurasi TLS yang melangkau pengesahan sijil dan tidak menetapkan keupayaan dailan tersuai atau tetapan proksi.
  • Konfigurasi pelanggan:

    • Kod yang diubah suai menggunakan http.Transport 创建新的 http.Client tersuai untuk mencipta http.Client baharu dan menetapkan tamat masa kepada 10 saat.
    • Kod asal juga cuba mencipta http.Client baharu menggunakan tersuai http.Transport 创建新的 http.Client ,但后来在 main 函数中,它使用新的 http.Client 覆盖了 client 变量,其中包含默认的 Transport 和超时10秒的,有效丢弃自定义的 Transport tetapi kemudian dalam fungsi main ia menggunakan http.Client baharu > Mengatasi pembolehubah client, yang mengandungi Transport lalai dan tamat masa 10 saat, dengan berkesan membuang Transport tersuai.
  • Tandatangan fungsi:

    • Kod yang diubah suai telah diubah suai GetCatFactGetJson 函数以接受 *http.Client 参数,允许它们使用在 main 中创建的自定义 http.Client.
    • Kod asal tidak termasuk http.Client 传递给这些函数,因此它们将使用 net/http 包提供的默认 http.Client .
  • Laman web:

    • Kod yang diubah suai memulihkan URL dalam fungsi GetCatFact kepada "https://catfact.ninja/fact" memandangkan pelayan mengubah hala permintaan HTTP ke HTTPS juga.
    • Kod asal telah menukar URL kepada "http://catfact.ninja/fact" untuk mengelakkan ralat jabat tangan TLS.
<小时/>

Fungsi customDialContext 函数不包含任何专门忽略 TLS 握手错误或将 TLS 握手更改为非 TLS 连接的逻辑。它只提供了自定义拨号功能,在提供的形式中,直接调用net.Dial dalam kod yang disediakan di atas tidak mengandungi sebarang logik untuk mengabaikan ralat jabat tangan TLS secara khusus atau menukar jabat tangan TLS kepada sambungan bukan TLS. Ia hanya menyediakan fungsi dailan tersuai, dalam bentuk yang disediakan, memanggil terus

tanpa sebarang pemprosesan khas.

http.Transport结构体的TLSClientConfig字段提供的,具体是将InsecureSkipVerify字段设置为trueMekanisme untuk mengabaikan ralat pengesahan sijil TLS sebenarnya disediakan oleh medan TLSClientConfig dalam

struktur, khususnya dengan menetapkan medan InsecureSkipVerify kepada true :🎜
tr := &http.Transport{
    TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
Salin selepas log masuk

该配置告诉 Go 跳过验证服务器的证书链和主机名,这是 TLS 握手过程的一部分。但是,它不会忽略其他类型的 TLS 握手错误或切换到非 TLS 连接。通常不建议在生产环境中使用 InsecureSkipVerify: true,因为它会禁用重要的安全检查。

如果您想强制使用非 TLS(纯 HTTP)连接,通常只需使用 http:// URL,而不是 https:// URL。但是,如果服务器或代理服务器将 HTTP 重定向到 HTTPS(例如 http://catfact.ninja/fact 的情况),则客户端将遵循重定向并切换到 TLS 连接。

Atas ialah kandungan terperinci Cara membetulkan proxyconnect tcp: tls: rekod pertama tidak kelihatan seperti jabat tangan TLS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Mar 21, 2025 pm 06:37 PM

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Apakah arahan Go FMT dan mengapa ia penting? Apakah arahan Go FMT dan mengapa ia penting? Mar 20, 2025 pm 04:21 PM

Artikel ini membincangkan perintah Go FMT dalam pengaturcaraan GO, yang format kod untuk mematuhi garis panduan gaya rasmi. Ia menyoroti kepentingan GO FMT untuk mengekalkan konsistensi kod, kebolehbacaan, dan mengurangkan perdebatan gaya. Amalan terbaik untuk

Kaedah Pemantauan PostgreSQL di bawah Debian Kaedah Pemantauan PostgreSQL di bawah Debian Apr 02, 2025 am 07:27 AM

Artikel ini memperkenalkan pelbagai kaedah dan alat untuk memantau pangkalan data PostgreSQL di bawah sistem Debian, membantu anda memahami pemantauan prestasi pangkalan data sepenuhnya. 1. Gunakan PostgreSQL untuk membina pemantauan PostgreSQL sendiri menyediakan pelbagai pandangan untuk pemantauan aktiviti pangkalan data: PG_STAT_ACTIVITY: Memaparkan aktiviti pangkalan data dalam masa nyata, termasuk sambungan, pertanyaan, urus niaga dan maklumat lain. PG_STAT_REPLITI: Memantau status replikasi, terutamanya sesuai untuk kluster replikasi aliran. PG_STAT_DATABASE: Menyediakan statistik pangkalan data, seperti saiz pangkalan data, masa komitmen/masa rollback transaksi dan petunjuk utama lain. 2. Gunakan alat analisis log pgbadg

Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Apr 02, 2025 am 09:12 AM

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

See all articles