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 文件的相关部分以供审查 (这取决于服务器证书验证模式。 例如,当我们使用 CertificationValidationMode=Custom 时,我们可以指定实现
的自定义 X509validator 类System.IdentityModel.Selectors.X509CertificateValidator
在处理客户端证书时可以进行自定义验证。 如果CertificateionValidationMode=ChainTrust,则必须确保客户端存储在正确的存储区,并且与服务器证书在同一个链中。 服务器证书验证方式是什么? 如果有什么我可以帮助的,请随时与我联系。
【讨论】:
我们在服务器上有一个获取证书并进行检查的自定义行为,但使用此证书的行为永远不会被执行。服务在行为执行之前返回错误。以上是关于System.Net.WebException:远程服务器返回错误:(403)禁止的主要内容,如果未能解决你的问题,请参考以下文章
System.Net.WebException:无法解析远程名称:
System.Net.WebException HTTP 状态码
System.Net.WebException:请求被中止:请求被取消