使用c#Post的不受信任的ssl证书

时间:2012-06-01 12:06:40

标签: c# iis ssl https posting

我们在IIS6中创建了一个证书,并使用SSL将其应用于站点。 现在,我们之前使用的相同程序将无效。据我所知,c#透明地支持HTTPS,所以我认为必须使用“不受信任”的证书。关闭代理设置后(获得403禁止错误),我收到“无法建立SSL的信任关系”

我尝试了一些解决方法,比如使用验证黑客交换默认的证书策略,但它已经很老了,我仍然得到同样的错误。

以下是我的帖子方法。

 try
    {
        HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
        HttpWebRequest.DefaultCachePolicy = policy;


        byte[] buffer = Encoding.UTF8.GetBytes(postData);
        //Initialisation
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url);
        WebReq.Timeout = 10000;
        //method is post

        if (useproxy == "ON")
        {
            WebProxy myProxy = new WebProxy();
            // Create a new Uri object.
            Uri newUri = new Uri(proxy);

            // Associate the new Uri object to the myProxy object.
            myProxy.Address = newUri;
            WebReq.Proxy = myProxy;
        }


        WebReq.KeepAlive = false;
        WebReq.Method = "POST";
        WebReq.ContentType = "application/x-www-form-urlencoded";


        //The length of the buffer 
        WebReq.ContentLength = buffer.Length;
        Stream PostData = WebReq.GetRequestStream();
        //write, and close. 
        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();

        //Get the response handle
        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

        Console.WriteLine(WebResp.StatusCode);
        Console.WriteLine(WebResp.Server);

        //Do not worry about response!. 
        //read the response (the string), and output it.
        Stream Answer = WebResp.GetResponseStream();
        StreamReader _Answer = new StreamReader(Answer);
        vystup = _Answer.ReadToEnd();


        if (vystup != "OK")
        {

        }
    }
    catch (WebException ex)
    {

        Console.WriteLine(ex);
    }

证书或我的应用程序或IIS中是否有解决此问题的解决方法?据推测它的C#不信任证书,但这是我第一次去Https。

欢迎提供任何信息。

2 个答案:

答案 0 :(得分:3)

默认情况下,.NET证书策略将拒绝任何未经验证或不受信任的服务器证书,因为99%的时间都是您想要的。 (默认情况下,唯一通过的“坏”证书已过期,但其他有效证书已过期。)

您有几个选项,具体取决于您所谈论的部署规模。

  1. 在客户端上安装服务器证书作为受信任的根证书。对于测试,这是最简单的选项,我使用我的开发机器的IIS和IIS Express证书一直这样做。 可怕的生产理念。

  2. 使用内部CA生成证书;如果您在具有Active Directory设置的公司工作,则AD服务器可以充当CA,您可以使用组策略自动将AD服务器的CA根目录推送到客户端。如果你在内部部署一些东西,这是一个很好的方法,因为它非常便宜:)

  3. ServicePointManager类上实现忽略任何SSL错误的ServerCertificateValidationCallback。这里唯一真正的缺陷是这是一个全局设置,因此 WebRequest类的每个使用都将使用您的自定义验证回调。

答案 1 :(得分:0)

我认为这不起作用,因为你没有要求通过SSL发生WebRequest。

根据Microsoft,您需要添加WebReq.EnableSsl = true;

之类的内容