卡在 mitm https 代理中的 AuthenticateAsServer 方法
Stuck on AuthenticateAsServer method in mitm https proxy
我正在尝试编写一个简单的https mitm代理,但在处理请求时出现问题:
public async Task Run(NetworkStream client, NetworkStream host) {
try {
//getting the cert
var certificate = new X509Certificate(@"[PATH_TO_CERT]", "[PASSWORD]");
//creating client's Ssl Stream
var clientStream = new SslStream(client, false);
//there the program freezes
clientStream.AuthenticateAsServer(certificate, false, SslProtocols.Default, false);
//creating server's Ssl Stream
var serverSslStream = new SslStream(host, false, SslValidationCallback, null);
serverSslStream.AuthenticateAsClient("[HOSTNAME]");
//...
} catch (Exception ex) {
Console.WriteLine(ex.Message);
throw;
}
}
客户端请求发送后,程序卡在这一行
clientStream.AuthenticateAsServer(certificate, false, SslProtocols.Default, false);
而且它不会抛出任何异常。起初我以为问题出在客户端的流中,所以我尝试将它的TcpClient
作为方法参数传递,但没有任何改变。
我的自签名证书和 .pfx 文件是这样创建的:
makecert -n CN=*.[HOSTNAME].com -ic MyCA.cer -iv MyCA.pvk -a sha1 -sky exchange -pe -sr currentuser -ss my SslServer.cer
makecert.exe -pe -n "CN=*.[HOSTNAME].com" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv server.pvk server.cer
pvk2pfx -pvk MyCA.pvk -pi [PASSWORD] -spc MyCA.cer -pfx MyPFX.pfx -f
所以我认为问题出在这一行
var certificate = new X509Certificate(@"[path to the cert]", "[password]");
我将 cer 路径替换为 pfx 路径,我什至下载了原始 crt 文件 new X509Certificate(@"[path to the original cert]");
,但是 none 这有效。
不知道问题出在哪里,我试了不同的客户端,结果都是一样的
我的 Visual Studio 版本是 15.7.27703.2018,.Net 是 4.7.1。
有什么提示、建议或链接可以帮助我吗?
结果我需要将它与 await 一起使用。
最终代码如下所示:
//getting the cert
var certificate = new X509Certificate2(@"[PATH_TO_CERT]", "[PASSWORD]");
//creating client's Ssl Stream
var clientStream = new SslStream(client, false);
await clientStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Ssl3, false);
我正在尝试编写一个简单的https mitm代理,但在处理请求时出现问题:
public async Task Run(NetworkStream client, NetworkStream host) {
try {
//getting the cert
var certificate = new X509Certificate(@"[PATH_TO_CERT]", "[PASSWORD]");
//creating client's Ssl Stream
var clientStream = new SslStream(client, false);
//there the program freezes
clientStream.AuthenticateAsServer(certificate, false, SslProtocols.Default, false);
//creating server's Ssl Stream
var serverSslStream = new SslStream(host, false, SslValidationCallback, null);
serverSslStream.AuthenticateAsClient("[HOSTNAME]");
//...
} catch (Exception ex) {
Console.WriteLine(ex.Message);
throw;
}
}
客户端请求发送后,程序卡在这一行
clientStream.AuthenticateAsServer(certificate, false, SslProtocols.Default, false);
而且它不会抛出任何异常。起初我以为问题出在客户端的流中,所以我尝试将它的TcpClient
作为方法参数传递,但没有任何改变。
我的自签名证书和 .pfx 文件是这样创建的:
makecert -n CN=*.[HOSTNAME].com -ic MyCA.cer -iv MyCA.pvk -a sha1 -sky exchange -pe -sr currentuser -ss my SslServer.cer
makecert.exe -pe -n "CN=*.[HOSTNAME].com" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic CA.cer -iv CA.pvk -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv server.pvk server.cer
pvk2pfx -pvk MyCA.pvk -pi [PASSWORD] -spc MyCA.cer -pfx MyPFX.pfx -f
所以我认为问题出在这一行
var certificate = new X509Certificate(@"[path to the cert]", "[password]");
我将 cer 路径替换为 pfx 路径,我什至下载了原始 crt 文件 new X509Certificate(@"[path to the original cert]");
,但是 none 这有效。
不知道问题出在哪里,我试了不同的客户端,结果都是一样的
我的 Visual Studio 版本是 15.7.27703.2018,.Net 是 4.7.1。
有什么提示、建议或链接可以帮助我吗?
结果我需要将它与 await 一起使用。
最终代码如下所示:
//getting the cert
var certificate = new X509Certificate2(@"[PATH_TO_CERT]", "[PASSWORD]");
//creating client's Ssl Stream
var clientStream = new SslStream(client, false);
await clientStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Ssl3, false);