首页 > 解决方案 > WCF 无法在没有提升的情况下访问本地计算机证书存储证书

问题描述

我有奇怪的问题。我的服务证书存储在 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 的两台不同的计算机上复制了这个问题

标签: c#socketswcfsslcertificate

解决方案


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

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

              </serviceCredentials>

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


推荐阅读