我尝试设置IIS 8(Windows Server 2012)以接受安全的WebAPI端点的客户端证书。在this post之后,我创建了自签名证书和客户端证书:
makecert.exe -r -n "CN=MyCompany" -pe -sv MyCompany.pvk -a sha1 -len 2048 -cy authority MyCompany.cer
makecert.exe -iv MyCompany.pvk -ic MyCompany.cer -n "CN=MY Client" -pe -sv MyClient.pvk -a sha1 -len 2048 -sky exchange MyClient.cer -eku 1.3.6.1.5.5.7.3.2
pvk2pfx.exe -pvk MyClient.pvk -spc MyClient.cer -pfx MyClient.pfx -po THE_PASSWORD
我在IIS服务器上安装了根证书MyCompany.cer,然后在IIS管理器/ SSL设置上我选择了"接受"单选按钮,允许网站接受客户证书。
在客户端,有一个C#测试控制台应用程序,用于加载客户端证书MyClient.pfx文件并调用WebAPI端点:
var certHandler = new WebRequestHandler();
certHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
certHandler.UseProxy = false;
var certificate = new X509Certificate2(File.ReadAllBytes(@"C:\MyClient.pfx"), "THE_PASSWORD");
certHandler.ClientCertificates.Add(certificate);
var client = new HttpClient(certHandler);
var result = client.GetAsync("https://MyServer/api/MyEndpoint").Result;
string resultStr = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(resultStr);
我收到了403错误:
403 - Forbidden: Access is denied.
You do not have permission to view this directory or page using the credentials that you supplied.
我在本地IIS(Windows 7)上尝试了相同的设置:导入MyCompany.cer文件,在IIS中设置SSL。这一次一切正常,WebAPI端点可以看到客户端证书没有问题。
有什么想法吗?
- 更新1
我在IIS上启用了失败的请求跟踪,我得到了这个:
<failedRequest url="https://myserver:443/"
siteId="35"
appPoolId="CertTest"
processId="7248"
verb="GET"
authenticationType="NOT_AVAILABLE" activityId="{00000000-0000-0000-B0AA-0280000000E0}"
failureReason="STATUS_CODE"
statusCode="403.16"
triggerStatusCode="403.16"
timeTaken="0"
xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
>
如果我理解正确,错误是403.16。我理解,当服务器上的证书未导入本地计算机下的受信任的根证书颁发机构时,就会发生这种情况。我仔细检查过,这不是我的情况。
答案 0 :(得分:4)
检查
如果没用,
答案 1 :(得分:0)
简而言之:Windows Server 2012(R2)中的客户端证书身份验证和IIS 8.x似乎存在问题,使用客户端证书时可能导致返回状态代码403.16。解决方案:
在服务器上的 HKey_Local_Machine \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL 下设置注册表DWORD条目:
SendTrustedIssuerList = 0
ClientAuthTrustMode = 2
该帖子进一步提到,如果在解决最初的问题(403.16)后得到403.13(吊销了客户端证书),则应在服务器上禁用客户端证书吊销检查。我不建议这样做。请确保在客户端证书中正确设置了CDP。 CDP必须可以从服务器访问,并且吊销列表应该有效且不过期。