【问题标题】:GetClientCert is not picking up on IIS hosted apiGetClientCert 未在 IIS 托管 api 上使用
【发布时间】:2021-01-29 04:38:34
【问题描述】:

我尝试在 WEB API 上手动验证证书。问题一直存在,GetClientCertificate 只是返回 null。

            var certRequest= actionContext.Request.GetClientCertificate();
            certRequest == null ? "Certificate not found" : $"Certificate found";

IIS 网站就像,https://testapi.web.com 附加在 SSL 上的证书文件显示为 DNS=*.web.com 。 证书存储中有另一个证书文件,但未与 HTTPS 绑定一起映射。 那 DNS =cl-testapi.web.com

我尝试提供来自客户端调用的证书文件,并且每次都收到GetClientCertificate 文件为空。

client side code:

var handler = new HttpClientHandler()
                {
                    SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2
                };
                handler.ClientCertificates.Add(new X509Certificate2(@"c:\testcert.cer"));
                
                var client = new HttpClient(handler);
                
                var data = new StringContent([xmlcontent], Encoding.UTF8, "application/xml");
                var result = client.PostAsync("https://testapi.web.com", data).GetAwaiter().GetResult();
                var resultString = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();

谁能提出这方面的问题。

已验证,IIS 已“接受”作为 SSL 设置。此外,这两个证书文件都是有效的,并且在使用“GetClientCert”时,neighter 能够选择服务器 api。

/////////// 尝试使用证书文件搜索客户端证书存储并附加,

var handler = new HttpClientHandler()
                {
                    SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2
                };
                X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly);
                var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, "thumbprintGUID COPIED FROM CLIENT CERT", false);
                handler.ClientCertificates.Add(certCollection[0]);
                var client = new HttpClient(handler);

//注意,certCollection[0].HasPrivateKey 在这里是false

更新: 现在请求使用,PFX 文件和密码。我可以看到,私钥存在是真的。 certCollection[0].HasPrivateKey 在这里是 true。但是,没有收到 GetClientCert。

【问题讨论】:

  • 您的证书没有私钥。这种方式是行不通的。
  • 它是一个客户端证书文件。它从 mmc 控制台导出。
  • 证书未与私钥关联,因此客户端证书无法执行身份验证,IIS 将拒绝它(不确定是否会发送到 IIS)。您需要一个带有相关私钥的证书。
  • 现在,使用私钥从服务器导出证书文件,并通过 pfx 文件安装在本地证书存储中。现在,使用X509Store 附加证书文件并通过指纹搜索证书。我可以看到,证书文件可以在handler.ClientCertificates.Add(certcollection[0]) 上找到并附加;但它仍然服务器说,GetClientCert 为空
  • 显示您的新代码。 cert.HasPrivateKey 属性是否返回 True?

标签: c# iis-7 ssl-certificate client-certificates x509certificate2


【解决方案1】:

您可以尝试更正c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys文件夹的权限以解决10013错误。

  1. 所有人都可以访问:特别适用于:仅此文件夹
  2. 网络服务访问:读取和执行适用于:此文件夹、子文件夹和文件
  3. 管理员访问:完全控制适用于:此文件夹、子文件夹和文件
  4. 系统访问:完全控制适用于:此文件夹、子文件夹和文件
  5. IUSR 访问:完全控制适用于:此文件夹、子文件夹和文件

【讨论】:

  • 我已经在证书商店下设置了证书文件的权限。应用程序池的权限。也尝试使用Everyone 权限,但问题与现在相同。
  • 这可能是.Net Framework 的问题,您可以尝试更改注册表。这是与该问题类似的错误的链接:link
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 2016-04-07
  • 2016-06-06
  • 2023-02-21
  • 2020-03-11
  • 1970-01-01
  • 2020-03-09
  • 2018-02-17
相关资源
最近更新 更多