【发布时间】: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];