在c#httpwebrequest中禁用主机名验证

在c#httpwebrequest中禁用主机名验证,c#,ssl,hostname,C#,Ssl,Hostname,我正在c#环境中实现web服务。我正在使用SSL连接。我的url类似于: https://pseudoservername:8443/services/... 但该证书预计: https://ourcompany.services.public.com:8443/services/... 所以我的主机名不匹配。在Java中,您可以通过创建自己的hostnameVerifier类并让JVM使用该类而不是普通类来关闭主机名验证。这是非常有用的,因为效果只是本地的(仅禁用此应用程序的验证)和临时的

我正在c#环境中实现web服务。我正在使用SSL连接。我的url类似于:

https://pseudoservername:8443/services/...
但该证书预计:

https://ourcompany.services.public.com:8443/services/...
所以我的主机名不匹配。在Java中,您可以通过创建自己的hostnameVerifier类并让JVM使用该类而不是普通类来关闭主机名验证。这是非常有用的,因为效果只是本地的(仅禁用此应用程序的验证)和临时的(可以在应用程序需要时打开/关闭hostnameverification)

你怎么知道这是用c#写的


我不想要忽略整个证书验证的解决方案。我还希望保留禁用hostnameverification的本地和临时效果。我也不想因为超出此问题范围的原因而更改我的url(只是为了使它们匹配)。

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

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

有关详细信息,请参见

如果您使用的是WebRequests或类似的工具,则可以连接到
ServicePointManager.ServerCertificateValidationCallback
并添加自定义验证场景,如下所示:

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

有关详细信息,请参见

我在问题中明确表示,我不想通过在每次检查时简单地返回true来禁用证书检查。我只希望验证忽略证书的主机名。我如何做到这一点?如上所述,您可以使用它来实现自定义验证,例如检查错误==SslPolicyErrors.RemoteCertificateNameMatch抱歉,我忽略了异常的名称!(我认为这是一个普遍的例外)在答案的第一个版本中,在您的评论通过检查您描述的错误成功实施解决方案后,添加了对RemoteCertificateMatch的特定检查,奖励!还有一点需要注意:SslPolicyErrors是一个标记的枚举,这意味着我还必须检查:“case(SslPolicyErrors.RemoteCertificateChainErrors | SslPolicyErrors.RemoteCertificateNameMismatch)”等。我在问题中明确表示,我不想通过每次检查都返回true来禁用证书检查。我只希望验证忽略证书的主机名。我如何做到这一点?如上所述,您可以使用它来实现自定义验证,例如检查错误==SslPolicyErrors.RemoteCertificateNameMatch抱歉,我忽略了异常的名称!(我认为这是一个普遍的例外)在答案的第一个版本中,在您的评论通过检查您描述的错误成功实施解决方案后,添加了对RemoteCertificateMatch的特定检查,奖励!还有一点需要注意:SslPolicyErrors是一个标记的枚举,这意味着我还必须检查:“case(SslPolicyErrors.RemoteCertificateChainErrors | SslPolicyErrors.RemoteCertificateNameMismatch)”和其他。