【问题标题】:Disable hostname verification in c# httpwebrequest在 c# httpwebrequest 中禁用主机名验证
【发布时间】:2014-03-19 23:46:53
【问题描述】:

我正在 c# 环境中实现 Web 服务。我正在使用 SSL 连接。我的网址是这样的:

https://pseudoservername:8443/services/...

但证书期望它是:

https://ourcompany.services.public.com:8443/services/...

所以我得到一个主机名不匹配。在 Java 中,您可以通过创建自己的 hostnameVerifier 类并让 JVM 使用该类而不是普通类来简单地关闭此主机名验证。这非常有用,因为效果只是本地的(仅禁用此应用程序的验证)和临时的(可以在应用程序想要的时候打开/关闭主机名验证)。

你怎么能在 c# 中做到这一点?

我不想要忽略整个证书验证的解决方案。我还想保留禁用主机名验证的本地和临时效果。由于超出此问题范围的原因,我也不想更改我的网址(只是使它们匹配)。

【问题讨论】:

    标签: c# ssl hostname


    【解决方案1】:

    如果您使用 WebRequests 或类似的东西,您可以连接到 ServicePointManager.ServerCertificateValidationCallback 并将自定义验证场景添加为

    ServicePointManager.ServerCertificateValidationCallback = delegate(
                Object obj, X509Certificate certificate, X509Chain chain, 
                SslPolicyErrors errors)
                {
                    if (errors == SslPolicyErrors.RemoteCertificateNameMismatch)
                    {
                      return (true);
                    }
                };
    

    详情请参阅MSDN

    【讨论】:

    • 我在我的问题中特别说过,我不想通过在每张支票上简单地返回 true 来禁用我的证书检查。我只希望验证忽略证书的主机名。我该怎么做?
    • 如上所述,您可以使用它来实现自定义验证,例如检查错误 == SslPolicyErrors.RemoteCertificateNameMismatch
    • 抱歉,我忽略了异常的名称! (我认为这是一个普遍的例外)
    • 它在答案的第一个版本中,在您的评论之后添加了对 RemoteCertificateNameMismatch 的特定检查
    • 我通过检查您描述的错误成功地实施了一个解决方案,获得了赏金!只是一个附加说明:SslPolicyErrors 是一个标记的枚举,这意味着我还必须检查:“case (SslPolicyErrors.RemoteCertificateChainErrors | SslPolicyErrors.RemoteCertificateNameMismatch)”等。
    猜你喜欢
    • 2017-04-25
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2020-05-17
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多