ホームページ  >  記事  >  バックエンド開発  >  proxyconnect tcp: tls: 最初のレコードが TLS ハンドシェイクのように見えないを修正する方法

proxyconnect tcp: tls: 最初のレコードが TLS ハンドシェイクのように見えないを修正する方法

王林
王林転載
2024-02-11 10:18:07606ブラウズ

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

php エディタ Apple は、「proxyconnect tcp: tls: 最初のレコードが TLS ハンドシェイクのように見えない」問題に対する解決策を提供します。このエラーは通常、プロキシ サーバーを使用しているときに発生し、ネットワーク接続の問題を引き起こす可能性があります。この問題を解決する前に、まず問題の原因を理解する必要があります。次の簡単な手順で、この問題を解決してネットワーク接続が適切に機能していることを確認する方法を示します。

質問の内容

「Go で REST API を使用する方法」では、パブリック REST API を呼び出すための完全に動作するサンプル コードが提供されています。しかし、この例を試すと、次のエラーが発生します:

リーリー

http ステータスに関するドキュメント

リーリー

そして書類を転送します:

リーリー

したがって、TLS を使用せずにクライアントからプロキシ への安全でない接続を有効にするように Dialcontext を構成する必要があると想定しています。でもどうすればいいのか分かりません。以下をお読みください:

  • golang でプロキシと TLS を行う方法;
  • プロキシ経由で HTTP/HTTPS GET を実行する方法;および
  • 間違った証明書を使用して https リクエストを実行するにはどうすればよいですか?

も役に立ちません。一部では、同じエラー proxyconnect tcp: tls:first Record doesn't Look like a TLS handshake が発生し、その理由を説明します:

リーリー

しかし、Steffen の返信には設定方法のサンプル コードがありません DialContext func(ctx context.Context, network, addr string)、Bogdan と cyberdelia はどちらも tls.Config{InsecureSkipVerify を設定することを推奨しています: true}、たとえば リーリー

しかし、上記は効果がありません。まだ同じエラーが発生します。そして、接続は依然として http://* ではなく https://*

を呼び出します。

これは、上記の提案を含めて適応させようとしたサンプルコードです:

リーリー

myClient からプロキシ経由でサーバーへの暗号化されていない接続を使用するように接続を構成するにはどうすればよいですか? DialContext func(ctx context.Context, network, addr string) を設定すると、これを行うのに役立ちますか?何をするか?

解決策

私が試してみたところ:

リーリー

内容:

  • カスタム ダイヤル機能customDialContext:
    この関数は現在、net.Dial の単純なラッパーですが、必要に応じてカスタム ダイヤル ロジックを導入する場所を提供します。これは、ネットワーク接続を作成するためのカスタム ダイヤル機能として使用されます。

  • 送信構成:

    • 変更されたコードは、カスタム http.Transport を特定の設定で構成します。これには、カスタム ダイヤル機能、環境内のプロキシ設定、証明書の検証 (テスト用) をスキップする TLS 構成が含まれます。
    • 元のコードはカスタム http.Transport の構成も試みますが、証明書の検証をスキップする TLS 構成のみが含まれており、カスタム ダイヤルアップ機能やプロキシ設定は設定されていません。
  • クライアント構成:

    • 変更されたコードは、カスタム http.Transport を使用して新しい http.Client を作成し、タイムアウトを 10 秒に設定します。
    • 元のコードは、カスタム http.Transport を使用して新しい http.Client を作成しようとしますが、main 関数で、 new http.Client は、デフォルトの Transport と 10 秒のタイムアウトを含む client 変数をオーバーライドし、カスタム Transport を事実上破棄します。 。
  • 関数シグネチャ:

    • 変更されたコードでは、GetCatFact 関数と GetJson 関数が *http.Client パラメーターを受け入れるように変更され、main# で使用できるようになります。 ## カスタム http.Client で作成されました。
    • 元のコードはこれらの関数に
    • http.Client を渡さないため、net/http パッケージによって提供されるデフォルトの http.Client が使用されます。 。
    #########Webサイト: ######
  • 変更されたコードは、サーバーが HTTP リクエストを HTTPS にリダイレクトするため、

    GetCatFact 関数の URL を「https://catfact.ninja/fact」に復元します。

    元のコードでは、TLS ハンドシェイク エラーを回避するために、URL が「http://catfact.ninja/fact」に変更されています。
    • 上記のコードの
    • customDialContext
    関数には、TLS ハンドシェイク エラーを特に無視したり、TLS ハンドシェイクを非 TLS 接続に変更したりするロジックは含まれていません。カスタムダイヤル機能のみを提供しており、提供フォームでは特別な処理を行わずに
  • net.Dial
を直接呼び出しています。

TLS 証明書検証エラーを無視するメカニズムは、実際には、http.Transport 構造の TLSClientConfig フィールドによって提供されます。具体的には、

InsecureSkipVerify

フィールドを次のように設定します。 ###真実###:###

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

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

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

以上がproxyconnect tcp: tls: 最初のレコードが TLS ハンドシェイクのように見えないを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。