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