我遇到了将我的WCF客户端应用程序从Dev部署到Stagging区域(与live相同)的问题。
在我的ASP.NET应用上。 (具有WCF客户端)使用域用户作为应用程序池。这意味着当我验证我的X509证书时,它使用Windows域帐户的Kerberos身份验证。现在,在不断变化的环境中,我们必须使用应用程序池的本地计算机帐户。这意味着在交错的环境中,它在使用X509证书进行身份验证时使用NTLM。这不起作用。
有人可以说明解决(或解决)这个问题的最佳方法是什么?
由于
编辑: 例外情况如下:
在 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32 hr)at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(字节[] rawData,IntPtr密码,UInt32 dwFlags,布尔persistKeySet, SafeCertContextHandle&安培; pCertCtx)at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(字节[] rawData,Object password,X509KeyStorageFlags keyStorageFlags)at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(字节[] rawData,String password)at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(字节[] rawData,String password)at ... CertificateManager.GetClientCertificate(typCertificateTypes
中的CertificateType)
注意:我获取的证书文件来自SQL数据库,而不是存储在本地证书存储区中。
应用程序正在使用WCF客户端使用X509证书与远程服务器通信。我们无法控制服务部分。代码/配置之间的区别仅在于ASP.NET应用程序池帐户。此帐户是dev上的域用户帐户,但Stagging和Prod上的本地用户帐户。 (我知道不要问!这不是我的选择或决定:))
答案 0 :(得分:1)
<击> 即使使用域帐户,它仍然可以使用NTLM,因为它仍然是单个环。它在暂存环境中不起作用的原因是托管服务的服务器不知道托管服务客户端的服务器的本地用户。您可以尝试丑陋的黑客攻击:在第二台服务器上创建一个具有完全相同的用户名和密码的本地用户。但这只是浪费时间,因为你可以以同样的方式简单地关闭身份验证,因为:
不反映生产环境的临时环境无用。一旦它不反映真实环境,它就不依赖于您是否使用不同的身份验证机制或者根本不使用身份验证。如果您计划在生产中使用域帐户和Kerberos,则必须具有测试域和配置的Kerberos的暂存环境。否则你根本不必使用暂存,因为无论如何你都会修复生产中的实际集成错误。
好的,所以你的问题很模糊,因为它显然与帐户无关,而WCF的安全性完全不受Kerberos或NTLM的影响,因为你使用客户端证书对服务进行身份验证,不是吗?异常堆栈跟踪表明您的代码无法从原始数据(从SQL Server加载?)创建有效证书。因此,SQL数据库中的数据不正确,密码不正确或者您未正确加载数据。
答案 1 :(得分:1)
当运行您的ASP.net应用程序的应用程序池无法访问您要为WCF服务调用附加的客户端证书的私钥时,通常会出现此错误。请确保应用程序池标识可以访问证书私钥。您还可以粘贴用于加载的代码并将证书附加到WCF服务调用。