System.Net.WebException:远程服务器返回错误:(403)禁止

Posted

技术标签:

【中文标题】System.Net.WebException:远程服务器返回错误:(403)禁止【英文标题】:System.Net.WebException: The remote server returned an error: (403) Forbidden 【发布时间】:2019-08-01 18:20:49 【问题描述】:

我有一个 WCF 服务,需要使用证书进行客户端身份验证。

我有一个使用此 WCF 的简单控制台应用程序。

我有 2 个客户端证书,第一个客户端应用程序运行良好,第二个客户端证书返回此错误:

System.ServiceModel.Security.MessageSecurityException: The HTTP request was forbidden with client authentication scheme 'Anonymous'. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.

正如我在 IIS 日志中看到的,是 403.7。

两个证书都安装在同一个商店中,并且在执行控制台应用程序的用户的管理私钥中都具有相同的权限。

两个证书都有:

私钥 密钥使用:数字签名、不可否认性、密钥加密、数据加密 (f0) 增强的密钥使用:客户端身份验证 (1.3.6.1.5.5.7.3.2) 有效并具有相同的认证路径

有什么想法吗?

更新

如果我激活 SCHANNEL 日志记录,当我使用失败的证书时,我们会在事件查看器上看到以下错误:

已解决

问题是我们正在使用以下方式获取证书:

X509FindType.FindBySubjectName

对于我们正在使用的主题,至少还有另外 3 个证书包含该主题。

那么我们得到的证书不正确,我们改代码使用

X509FindType.FindBySubjectDistinguishedName 要么 X509FindType.FindByThumbprint

现在获得正确的客户端证书并且可以工作了。

【问题讨论】:

我唯一的猜测是您的请求无法通过 WCF 服务进行身份验证,因为它可能托管在 aspnet 应用程序中? 如果证书都有效,具有相同的证书路径并且配置相同,那么问题可能与 WCF 配置有关。也许您可以发布 app.config 文件的相关部分以供审查 ( 我有一个 customBinding: 我认为客户端仍然需要通过指定以下内容来识别要使用的证书:( 我在代码中分配客户端证书,X509Store x509Store = new X509Store(StoreName.My, StoreLocation.LocalMachine); x509Store.Open(OpenFlags.ReadOnly); X509Certificate2Collection x509Certificate2Collection = x509Store.Certificates.Find(X509FindType.FindBySubjectName, text, true); client.ClientCredentials.ClientCertificate.Certificate = x509Certificate2Collection[0]; 【参考方案1】:

这取决于服务器证书验证模式。 例如,当我们使用 CertificationValidationMode=Custom 时,我们可以指定实现

的自定义 X509validator 类
System.IdentityModel.Selectors.X509CertificateValidator

在处理客户端证书时可以进行自定义验证。 如果CertificateionValidationMode=ChainTrust,则必须确保客户端存储在正确的存储区,并且与服务器证书在同一个链中。 服务器证书验证方式是什么? 如果有什么我可以帮助的,请随时与我联系。

【讨论】:

我们在服务器上有一个获取证书并进行检查的自定义行为,但使用此证书的行为永远不会被执行。服务在行为执行之前返回错误。

以上是关于System.Net.WebException:远程服务器返回错误:(403)禁止的主要内容,如果未能解决你的问题,请参考以下文章

System.Net.WebException:无法解析远程名称:

System.Net.WebException:操作已超时

System.Net.WebException HTTP 状态码

System.Net.WebException:请求被中止:请求被取消

ArangoDB-NET 错误:System.Net.WebException:'不知道这样的主机 不知道这样的主机'

System.Net.WebException 的 Powershell 处理