c# - 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 的两台不同的计算机上复制了这个问题
解决方案
我还建议您使用本地计算机存储而不是当前用户存储。因为当运行程序的用户发生变化时,可能会导致证书不可搜索。另外,最好通过Thumbprint
.
<serviceCertificate storeLocation="LocalMachine"
storeName="My" x509FindType="FindByThumbprint"
findValue="974ad39ff0b86210f5e7d661e56945ad5c2d3770"/>
</serviceCredentials>
最后,我认为问题的根源可能是访问证书的公钥或私钥需要权限,我建议您将Everyone
帐户添加到证书管理私钥组中。
如果问题仍然存在,请随时告诉我。
推荐阅读
- arrays - 从文本文件 C 中获取 2d char 数组维度和内容
- json - Ktor 动态文件路径
- cupy - Cupy 错误:模块 'cupy' 没有属性 'gradient'
- java - 带有微服务和 Docker-Compose 错误的 Spring Cloud Stream Kafka
- python - “值”对象没有属性“保存”
- clang-format - 我可以禁用 Clang 格式中某些宏的所有调用的格式吗?
- sql - 如何在存储过程中从 VARIABLE 表中选择数据
- mysql - mySQL 选择随时间变化 X% 的价格记录
- java - 无法使用本地 JDBC 应用程序连接到安装在 aws 中的 mysql
- sockets - 在 Windows 上使用来自 GNU Emacs 的 Emacs Lisp 打开 UDP / 数据报套接字