C# 如何通过代理转发SSL(HTTPS)响应?
我必须跟踪HTTP流量。它在没有Https的情况下工作。我尝试使用https,它成功地通过证书通过Sslstream获得响应。当我为中继转发ssl响应,但它没有得到响应时 请告诉我如何中继SSL响应 请检查以下代码以获取相同信息 谢谢C# 如何通过代理转发SSL(HTTPS)响应?,c#,https,proxy,tcplistener,C#,Https,Proxy,Tcplistener,我必须跟踪HTTP流量。它在没有Https的情况下工作。我尝试使用https,它成功地通过证书通过Sslstream获得响应。当我为中继转发ssl响应,但它没有得到响应时 请告诉我如何中继SSL响应 请检查以下代码以获取相同信息 谢谢 public void ThreadHandleHTTPClient(object o) { try{ Socket client = (Socket)o; Stream ns = new Ne
public void ThreadHandleHTTPClient(object o)
{
try{
Socket client = (Socket)o;
Stream ns = new NetworkStream(client);
//Stream outStrem = ns;
//RECEIVE CLIENT DATA
byte[] buffer = new byte[2048];
int rec = 0, sent = 0, transferred = 0, rport = 0;
string data = "";
do
{
rec = ns.Read(buffer, 0, buffer.Length);
data += Encoding.ASCII.GetString(buffer, 0, rec);
} while (rec == buffer.Length);
//PARSE DESTINATION AND SEND REQUEST
string line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
string e=line.Split(new string[] { " " }, StringSplitOptions.None)[1];
Uri uri = new Uri(e);
if (uri.Scheme == "https" || line.Contains("CONNECT"))
{
rport = 443;
//Make tunnel for the HTTPS which is authentic host.
SslStream sslStream = sslTunnel(ns, uri.OriginalString, "1.0");
ns = sslStream;
string remoteUri = "https://" + uri.Scheme;
StreamReader clientStreamReader = new StreamReader(sslStream);
string httpCmd = clientStreamReader.ReadLine();
string[] splitBuffer = httpCmd.Split(_spaceSplit, 3);
remoteUri = remoteUri + splitBuffer[1];
myQuery = string.Empty;
//Read the SSL Stream save command in myQuery variable.
readRequestHeadersEx(clientStreamReader);
data = myQuery;
data = splitBuffer[0]+" ";
data += remoteUri;
data += " ";
data += splitBuffer[2];
data += "\r\n";
data += myQuery;
data += "\r\n";
line = data.Replace("\r\n", "\n").Split(new string[] { "\n" }, StringSplitOptions.None)[0];
uri = new Uri(line.Split(new string[] { " " }, StringSplitOptions.None)[1]);
}
else
{
rport = 80;
}
IPHostEntry rh = Dns.GetHostEntry(uri.Host);
Socket remoteserver = new Socket(rh.AddressList[0].AddressFamily, SocketType.Stream, ProtocolType.IP);
remoteserver.Connect(new IPEndPoint(rh.AddressList[0], rport));
byte[] databytes = Encoding.ASCII.GetBytes(data);
remoteserver.Send(databytes, databytes.Length, SocketFlags.None);
//START RELAY
buffer = new byte[2048];
rec = 0;
data = "";
do
{
transferred = 0;
do
{
rec = remoteserver.Receive(buffer, buffer.Length, SocketFlags.None);
sent = client.Send(buffer, rec, SocketFlags.None);
transferred += rec;
data += Encoding.ASCII.GetString(buffer, 0, rec);
} while (rec == buffer.Length);
if (transferred == 0)
break;
} while (transferred > 0);
client.Close();
}
catch (Exception ex)
{
}
}
public void Start(IPAddress ip, int port)
{
TcpListener listener = new TcpListener(ip, port);
listener.Start(100);
while (true)
{
Socket client = listener.AcceptSocket();
Thread th = new Thread(ThreadHandleHTTPClient);
th.Start(client);
}
listener.Stop();
}
中继SSL?我不知道您为什么要这样做……但SSL的设计是为了防止中间人攻击,这看起来很可疑。如果确实是这样的话,您需要做一些类似于fiddler的事情,使用受信任的SSL证书并为您连接到的每个主机动态创建SSL证书。感谢快速回复,实际上我想记录https和HTTP通信量。是的,它是“中间人”,并且按照你的建议做同样的事情。为每个主机应用SSL证书,它工作正常。当我将SSLStream响应转发给继电器时,我没有得到响应。请检查以下步骤中的SSL中继,1)如果找到连接和https方法2)SSL身份验证3)读取SSL流4)简而言之,如果完成步骤4,套接字将无法接收单个字节。您可以在附加的代码中找到“启动中继”标记。中继?:连接到远程主机并接收数据并将其转发到本地代理。