gpt4 book ai didi

c# - 如何连接到 HTTPS 代理?

转载 作者:太空狗 更新时间:2023-10-29 20:11:24 36 4
gpt4 key购买 nike

我正在尝试使用套接字通过代理连接到 HTTPS 服务器。据我所知,当使用 HTTP 代理时,应该将套接字连接到它,然后与它交互,因为它是真正的服务器。对于 HTTP,此方法有效,但对于 HTTPS 无效。为什么?

这是连接到 HTTPS 服务器的简单程序

using System;
using System.Text;
using System.Net.Sockets;
using System.Net.Security;

namespace SslTcpClient
{
public class SslTcpClient
{
public static void Main(string[] args)
{
string host = "encrypted.google.com";
string proxy = "127.0.0.1";//host;
int proxyPort = 8888;//443;

// Connect socket
TcpClient client = new TcpClient(proxy, proxyPort);

// Wrap in SSL stream
SslStream sslStream = new SslStream(client.GetStream());
sslStream.AuthenticateAsClient(host);

// Send request
byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}/ HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
sslStream.Write(request);
sslStream.Flush();

// Read response
byte[] buffer = new byte[2048];
int bytes;
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
} while (bytes != 0);

client.Close();
Console.ReadKey();
}
}
}

proxy = hostproxyPort = 443 时连接成功。但是当我将它们设置为 127.0.0.1:8888(本地主机上的 fiddler 代理)时,它不起作用。程序卡在 sslStream.AuthenticateAsClient(host); 为什么? Fiddler 支持 HTTPS(浏览器可以通过它连接)。

附言不,我不能在我的案例中使用 HttpWebRequest

最佳答案

设法自己解决了。这是解决方案:

using System;
using System.Text;
using System.Net.Sockets;
using System.Net.Security;

namespace SslTcpClient
{
public class SslTcpClient
{
public static void Main(string[] args)
{
string host = "encrypted.google.com";
string proxy = "127.0.0.1";//host;
int proxyPort = 8888;//443;

byte[] buffer = new byte[2048];
int bytes;

// Connect socket
TcpClient client = new TcpClient(proxy, proxyPort);
NetworkStream stream = client.GetStream();

// Establish Tcp tunnel
byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT {0}:443 HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
stream.Write(tunnelRequest , 0, tunnelRequest.Length);
stream.Flush();

// Read response to CONNECT request
// There should be loop that reads multiple packets
bytes = stream.Read(buffer, 0, buffer.Length);
Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));

// Wrap in SSL stream
SslStream sslStream = new SslStream(stream);
sslStream.AuthenticateAsClient(host);

// Send request
byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}/ HTTP/1.1\r\nHost: {0}\r\n\r\n", host));
sslStream.Write(request, 0, request.Length);
sslStream.Flush();

// Read response
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes));
} while (bytes != 0);

client.Close();
Console.ReadKey();
}
}
}

关于c# - 如何连接到 HTTPS 代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6940893/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com