有没有办法从* .config文件声明性地设置ServicePointManager的ServerCertificateValidationCallback属性?

时间:2010-12-20 12:25:36

标签: .net validation ssl-certificate

我正在寻找一种以声明方式禁用证书验证的方法。 这非常有用,即使用svcutil.exe时。

到目前为止,我知道如何禁用主机名验证:

<system.net>
    <settings>
        <servicePointManager checkCertificateName="false" />
    </settings>
</system.net>

但这还不够。 我见过有人声称这可以做到,但没有任何样本。

3 个答案:

答案 0 :(得分:4)

我正在使用这个丑陋的黑客只在UnitTests中使用:(

的app.config:

<system.net>
    <webRequestModules xdt:Transform="Insert">
        <clear/>
        <add prefix = "http" type = "HttpRequestCreatorWithServerCertificateValidationCallback, TestHelpers"/>
        <add prefix = "https" type = "HttpRequestCreatorWithServerCertificateValidationCallback, TestHelpers"/>
    </webRequestModules>
</system.net>

HttpRequestCreatorWithServerCertificateValidationCallback.cs

public class HttpRequestCreatorWithServerCertificateValidationCallback : IWebRequestCreate
{
    static HttpRequestCreatorWithServerCertificateValidationCallback()
    {
        var type = typeof(HttpWebRequest).Assembly.GetType("System.Net.HttpRequestCreator");
        var ctor = type.GetConstructors()[0];
        Creator = (IWebRequestCreate)ctor.Invoke(null);

        ServicePointManager.ServerCertificateValidationCallback += delegate
        {
            return true;
        };
    }

    #region IWebRequestCreate Members

    public WebRequest Create(Uri uri)
    {
        return Creator.Create(uri);
    }

    #endregion

    private static readonly IWebRequestCreate Creator;
}

答案 1 :(得分:1)

我在使用HttpClient时使用它:

  <system.net>
    <settings>
      <servicePointManager
          checkCertificateName="false"
          checkCertificateRevocationList="false" />
    </settings>
  </system.net>

我从互联网上拿走它,不记得从哪里来。 它适用于我的后端调用。

答案 2 :(得分:0)

System.Net.ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);