我继承了一个ASP.NET MVC应用程序和一个ASP.NET Web Api,它们都使用SSL和需要客户端证书的api。两者都已经生产了一年多,现在发生了微小的变化。
对于开发,一切最初都是使用IIS Express设置的,一切正常但现在我需要将本地开发环境从IIS Express移出到本地IIS。 我的问题是从应用程序到api的所有请求都因我的设置而失败。
我认为我的IIS(Windows 7 IIS 7.5)设置正确,但我可能会出错。我有两个不同的站点在api和app的不同端口上运行,以及看起来适合SSL和一对一映射的设置。两个站点都有不同的应用程序池,并设置了两个本地用户(我最初尝试过NetworkService)。我在我的主机文件(localapp.com和localapi.com)中添加了两个域,并使用makecert为这两个域创建了两个证书。 api证书被标记为服务器身份验证,并且应用程序证书被标记为服务器和客户端身份验证(我已经为两个目的尝试了单独的证书)。这两个SSL证书具有在添加到证书存储区时标记为可导出的私钥,并且我已为这两个本地帐户授予了私钥权限。我的自签名根证书将添加到LocalMachine根证书存储中,并且两个站点证书(使用根证书签名)位于LocalMachine个人存储中。我可以独立连接到两个站点,也不会收到有关证书错误的任何警告。
如果我通过Chrome访问api网址,我可以选择相应的客户端证书并查看预期的JSON数据。访问应用程序是类似的,因为我没有得到任何证书警告但在它所做的任何api调用中都没有返回数据。
该应用程序正在使用RestSharp作为其HTTP请求,我已通过调试验证正在将正确的客户端证书添加到请求中,并且确实存在私钥。将证书添加到请求的代码应该没问题,因为它已经运行了一年多而且没有任何变化。应用程序的每个api请求都会返回
“System.ComponentModel.Win32Exception:无法识别提供给包的凭据”
和
“请求已中止:无法创建SSL / TLS安全通道。”
如果我查看网络跟踪,我会得到以下有关localapp.com证书的信息......
System.Net Information: 0 : [6564] SecureChannel#37489757 - Left with 1 client certificates to choose from.
System.Net Information: 0 : [6564] SecureChannel#37489757 - Trying to find a matching certificate in the certificate store.
System.Net Information: 0 : [6564] SecureChannel#37489757 - Locating the private key for the certificate: [Version]
V3
[Subject]
CN=localapp.com
Simple Name: localapp.com
DNS Name: localapp.com
[Issuer]
CN=DevRoot
Simple Name: DevRoot
DNS Name: DevRoot
[Serial Number]
975C024DB7A08A9A48BE78F3382D4A93
[Not Before]
12/31/2015 11:00:00 PM
[Not After]
12/30/2039 11:00:00 PM
[Thumbprint]
28F3032F0E6ED488CFFE6706D3B17F851EFE1860
[Signature Algorithm]
sha512RSA(1.2.840.113549.1.1.13)
[Public Key]
Algorithm: RSA
Length: 4096
Key Blob: 30 82 02 0a 02 82 02 01 00 a9 c2 27 fc 60 11 1d 99 fe 1e e7 fb 05 b4 75 33 4a e3 d5 33 15 0c 9d 72 6a 3a df e2 58 49 20 34 39 59 77 7e 85 f7 fa 93 53 92 1d fa 63 32 98 b1 66 74 b6 60 23 e2 2b 97 f6 d9 ce bb 0a 1a ae 2f c8 a1 44 6f 60 12 9a bd b6 33 87 90 8d 1c 1f 61 7e f5 85 41 de 30 11 78 01 72 6b eb 77 8e 1b 9f 58 45 f6 ad 0d d3 2d ec 59 1d 63 2a 18 2f 77 87 6c a3 fe ee 68 2e 12 94 6a d5 ce 69 77 98 f2 14 bd bb ff eb 49 ac 1d a5 06 bf 97 51 0e 36 e6 8f 55 45 a3 91 29 77 94 93 1a 78 54 ....
System.Net Information: 0 : [6564] SecureChannel#37489757 - Certificate is of type X509Certificate2 and contains the private key.
System.Net Information: 0 : [6564] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc = System.Net.SecureCredential)
System.Net Error: 0 : [6564] AcquireCredentialsHandle() failed with error 0X8009030D.
System.Net Information: 0 : [6564] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc = System.Net.SecureCredential)
System.Net Error: 0 : [6564] AcquireCredentialsHandle() failed with error 0X8009030D.
System.Net.Sockets Verbose: 0 : [16268] Socket#3648821::Dispose()
System.Net Error: 0 : [16268] Exception in HttpWebRequest#16098066:: - The request was aborted: Could not create SSL/TLS secure channel..
System.Net Verbose: 0 : [16268] HttpWebRequest#16098066::EndGetResponse()
System.Net Error: 0 : [16268] Exception in HttpWebRequest#16098066::EndGetResponse - The request was aborted: Could not create SSL/TLS secure channel..
跟踪日志看起来我没有正确设置权限,但我已明确授予本地用户对app和api证书的私钥的权限。其他具有0X8009030D错误的人看起来已经通过将应用程序池用户添加到私钥权限来解决了该问题。如果我转到MMC管理中的管理私钥以获取localapp.com证书,我会看到我的LocalApp和LocalApi用户具有读取权限。
对于我可以尝试让沟通工作的事情,我完全没有想法。这可能是非常简单的事情,但无论我尝试什么它都行不通。
任何人都曾尝试过这个设置并取得成功,或者任何人都有想法我可以尝试让它起作用吗?
非常感谢任何帮助。
提前致谢!
-Aaron