对于普通用户,“身份验证失败,因为远程方已关闭传输流”

Joh*_*cha 2 c# ssl wcf

第三方供应商正在添加身份验证(耶!),但它并不总是对我们有用(嘘!)。

当 C# 应用程序以“管理员身份”运行时,它可以正常工作。但是,当应用程序作为普通(非管理员)用户运行时,它会失败并显示消息

“身份验证失败,因为远程方已关闭传输流”

我们明确设置为 TLS 1.2

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)

我们是

  • 执行 4.6 .NET C# WCF 客户端
  • 使用 HTTPS Web 服务
  • 使用TLS1.2
  • 在 Windows Server 2012 平台上

Joh*_*cha 5

尽管 ServerCertificateValidationCallback 返回 true以及winhttpcertcfg 也为 Windows 7 中的 IIS 用户提供访问权限,但我们还是在“无法为具有权限的 SSL/TLS 建立安全通道”的帮助下解决了这个问题。

问题在于证书是为“计算机”帐户的受信任人员安装的。当以管理员模式运行或作为具有管理员权限的用户运行时,它运行良好。但是,当作为我们的“服务帐户”运行时(用引号引起来,因为它不是真正的服务帐户)——服务帐户没有读取证书的权限。

我们发现深入C:\ProgramData\Microsoft\crypto\rsa\machinekeys目录并更改适当证书的读取权限是有效的。

我们不喜欢建议的用于icacls更改已安装证书的读取权限的解决方案(部分原因是实际找到正确的证书条目是一项艰巨的任务。)

我们发现我们可以mmc.exe作为服务帐户运行,然后将其安装到该帐户的受信任人员级别。然后我们的非管理应用程序可以读取证书并建立连接。