【问题标题】:Is there a way to declaratively set ServicePointManager's ServerCertificateValidationCallback property from *.config file?有没有办法从 *.config 文件中以声明方式设置 ServicePointManager 的 ServerCertificateValidationCallback 属性?
【发布时间】:2010-12-20 12:25:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不是声明性的,但您可以使用 Fiddler 解决证书验证问题并愚弄 svcutil :)

标签: .net validation ssl-certificate


【解决方案1】:

我使用这个丑陋的 hack 只在 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;
}

【讨论】:

    【解决方案2】:

    我在使用 HttpClient 时使用它:

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

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

    【讨论】:

      【解决方案3】:
      System.Net.ServicePointManager.ServerCertificateValidationCallback =
                      ((sender, certificate, chain, sslPolicyErrors) => true);
      

      【讨论】:

      • 是的,我知道这一点,但它不是声明性的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2011-08-29
      • 1970-01-01
      相关资源
      最近更新 更多