使用带有.NET 2.0 HttpWebRequest的“服务帐户”证书存储区

时间:2009-10-12 20:57:27

标签: c# ssl httpwebrequest certificate

我有一个用C#编写的.net 2.0 Windows服务应用程序,它通过SSL使用HttpWebRequest访问非soap Web服务。我的Windows服务在NETWORK SERVICE帐户下运行。

我能够通过向我的Windows服务与CA通信的Web服务器颁发证书,然后将CA的证书安装到本地计算机\受信任的根存储库来使SSL工作。

我希望能够将CA的证书安装到“服务帐户”受信任的根证书存储区而不是“本地计算机”存储区,并使其“正常工作”。

换句话说,.net框架使用的SSL身份验证似乎是硬编码的,用于检查当前用户存储,以及验证SSL证书时可信根的本地计算机存储,但有没有任何干净的方法得到它来检查“服务帐户”商店而不是(或除了)其他商店?

我能想到的唯一解决方案是覆盖ServicePointManager.ServerCertificateValidationCallback,然后P / Invoke到Crypto API以在Win32中打开“服务帐户”证书存储区,并在那里手动搜索根目录。我宁愿不这样做,因为它似乎是一个相当大的性能损失,不得不等待我不打算使用的2个证书商店的失败。

可能,我在这里采取了完全错误的做法,但看起来我似乎错过了解决问题的简单方法。

1 个答案:

答案 0 :(得分:1)

如果您的代码控制着它正在与之交谈的服务器,那么为什么不从CertValidationCallback返回“true”?每次发出请求时,服务器证书都不会改变吗?

除非您确实需要系统也验证与证书相关的其他内容,例如CRL,到期等,您可以通过实现自定义证书验证回调来使其工作。

如果您真的想将证书安装到NETWORK_SERVICE a / c上下文中,那么Microsoft提供的工具可以帮助您实现这一目标。

http://support.microsoft.com/kb/901183 http://web.asu.edu/community/installing-client-certificate-windows-machine http://www.derkeiler.com/Newsgroups/microsoft.public.dotnet.security/2008-03/msg00011.html

祝你好运!