WCF 无法在没有提升的情况下访问本地计算机证书存储证书

Posted

技术标签:

【中文标题】WCF 无法在没有提升的情况下访问本地计算机证书存储证书【英文标题】:WCF can't access local machine certificate store certificates without elevation 【发布时间】:2020-06-10 01:45:11 【问题描述】:

我遇到了奇怪的问题。 我的服务证书存储在 localMachine/Personal 中。

并且被引用为,

          <serviceCredentials>
            <serviceCertificate findValue="TestCertificate56" storeLocation="LocalMachine" storeName="My" x509FindType="FindByIssuerName" />
          </serviceCredentials>

安装证书后,运行时不需要提升权限,一切似乎都可以正常工作。重新启动机器后,客户端突然无法再连接,因为服务终止了连接上的套接字

System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:10:00'. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)
   --- End of inner exception stack trace ---

在服务端没有指示错误的消息。如果我以提升模式运行服务,则没有问题。此外,如果我重新安装证书,它会一直工作到下次重新启动。此外,如果使用 CurrentUser 存储,则没有问题。

为什么这是一个问题?我的服务将作为 NetworkService 用户部署和运行,所以我相信它需要它在 LocalMachine 存储中的证书,而不是 CurrentUser 存储。我的服务没有管理员权限,所以问题会重新出现在生产环境中

编辑:我在运行 VS 2017 和 2019 的两台不同计算机上复制了该问题

【问题讨论】:

本地商店需要管理员权限。 @MrgGek 你的意思是本地机器商店?那么为什么可以获取已安装在此用户会话中的证书呢?还查看文档,我找不到任何直接的说明。 【参考方案1】:

我还建议您使用本地计算机存储而不是当前用户存储。因为当运行程序的用户发生变化时,可能会导致证书不可搜索。另外,最好通过Thumbprint配置证书。

    <serviceCertificate storeLocation="LocalMachine" 
storeName="My" x509FindType="FindByThumbprint"
 findValue="974ad39ff0b86210f5e7d661e56945ad5c2d3770"/>

              </serviceCredentials>

最后,我认为问题的根源可能是访问证书的公钥或私钥需要权限,我建议您将Everyone帐户添加到证书管理私钥组中。 如果问题仍然存在,请随时告诉我。

【讨论】:

以上是关于WCF 无法在没有提升的情况下访问本地计算机证书存储证书的主要内容,如果未能解决你的问题,请参考以下文章

在 Service Fabric 中通过 HTTPS 调用 WCF:请求被中止:无法创建 SSL/TLS 安全通道

WCF 客户端证书停止工作

Wcf 测试客户端如何在没有 Visual Studio 的情况下使用?

Silverlight+WCF项目Https配置

SSPI:用户主体名称 WCF 客户端

WCF 服务端点无法从本地访问