0

我继承了一个 ASP.NET MVC 应用程序和一个 ASP.NET Web Api,它们都使用 SSL 以及需要客户端证书的 api。两者都已经生产了一年多,但有细微的变化。

对于开发,一切最初都是用 IIS Express 设置的,一切正常,但现在我需要将本地开发环境从 IIS Express 移到本地 IIS。 我的问题是从应用程序到 api 的所有请求都因我的设置而失败

我想我的 IIS(Windows 7 IIS 7.5)设置正确,但我可能有问题。我有两个不同的站点在 api 和应用程序的不同端口上运行,以及看起来适合 SSL 和一对一映射的设置。两个站点都有不同的应用程序池,并设置了两个本地用户(我最初尝试过 NetworkService)。我在主机文件中添加了两个域(localapp.com 和 localapi.com),并使用 makecert 为这两个域创建了两个证书。api 证书标记为服务器身份验证,应用程序证书标记为服务器和客户端身份验证(我已经为这两种目的尝试了单独的证书)。这两个 SSL 证书具有在添加到证书存储时标记为可导出的私钥,并且我已授予两个本地帐户的私钥权限。我的自签名根证书已添加到 LocalMachine 根证书存储中,两个站点证书(使用根证书签名)位于 LocalMachine 个人存储中。我可以独立连接到这两个站点,并且不会收到任何有关证书错误的警告。

如果我通过 Chrome 访问 api URL,我可以选择适当的客户端证书并查看预期的 JSON 数据。访问该应用程序的类似之处在于我没有收到任何证书警告,但在它进行的任何 api 调用中都没有返回数据。

该应用程序使用 RestSharp 处理其 HTTP 请求,我通过调试验证了正确的客户端证书已添加到请求中,并且确实存在私钥。将证书添加到请求中的代码应该没问题,因为它已经运行了一年多并且没有任何改变。来自应用程序的每个 api 请求都会返回

“System.ComponentModel.Win32Exception:无法识别提供给包的凭据”

“请求被中止:无法创建 SSL/TLS 安全通道。”



如果我查看网络跟踪,我会得到关于 localapp.com 证书的以下信息……</p>

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..

跟踪日志看起来我没有正确设置权限,但我已明确授予本地用户对应用程序和 api 证书的私钥的权限。其他出现 0X8009030D 错误的人似乎已经通过将应用程序池用户添加到私钥权限来解决问题。如果我在 MMC 管理单元中管理私钥以获取 localapp.com 证书,我会看到我的 LocalApp 和 LocalApi 用户具有读取权限。


对于我可以尝试让沟通发挥作用的事情,我完全没有想法。这可能是非常简单的事情,但无论我尝试什么都行不通。


有人曾经尝试过这个设置并取得了成功,或者有人有想法我可以尝试让它工作吗?

任何帮助是极大的赞赏。

提前致谢!

-亚伦

4

0 回答 0