卡在mitm https代理中的AuthenticateAsServer方法上

时间:2018-06-19 15:36:01

标签: c# .net visual-studio sslstream

我正在尝试编写一个简单的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]");,但是这些都不起作用。

我不知道问题出在哪里,我尝试了不同的客户端,结果是一样的。

我的Visual Studio版本是15.7.27703.2018,.Net是4.7.1。

有什么提示,建议或链接可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

原来,我需要在等待时使用它。

最终代码如下:

->where('something = :foo')
->setParameter('foo', $fooValue)
->andWhere('something2 = :foo2')
->setParameter('foo2', $fooValue2)

->orWhere('something3 = :foo3')
->setParameter('foo3', $fooValue3)
->andWhere('something4 = :foo4')
->setParameter('foo4', $fooValue4)

->getQuery()
->getArrayResult()