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

Posted

技术标签:

【中文标题】普通用户的“身份验证失败,因为远程方已关闭传输流”【英文标题】:"Authentication failed because the remote party has closed the transport stream" for normal users 【发布时间】:2017-06-27 23:09:49 【问题描述】:

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

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

“验证失败,因为对方已经关闭了传输流”

我们明确设置为 TLS 1.2

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

我们是

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

【问题讨论】:

您与第三方供应商谈过吗?这是他们的代码,所以他们最有能力回答任何问题。 他们不知道。他们指出了我们的环境中的某些东西,因为它在以 ADMIN 用户身份运行但不能以任何其他用户身份运行时工作。 【参考方案1】:

我们在Getting "Could not establish secure channel for SSL/TLS with authority" even though ServerCertificateValidationCallback returns true 和winhttpcertcfg giving access to IIS user in Windows 7 的帮助下也解决了这个问题。

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

我们发现深入C:\ProgramData\Microsoft\crypto\rsa\machinekeys 目录并更改相应证书的读取权限是可行的。

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

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

【讨论】:

很高兴您发现了问题。并感谢您分享答案 - 这将帮助人们走在路上:)【参考方案2】:

这可能与 OP 的原始问题不同,但我的问题是我的 IIS 应用程序使用 Windows Auth Impersonation,因此它试图使用模拟用户访问 C:\ProgramData\Microsoft\crypto\rsa\machinekeys 中的证书文件没有权利这样做。

我更改了设计以关闭模拟,此问题不复存在。

【讨论】:

以上是关于普通用户的“身份验证失败,因为远程方已关闭传输流”的主要内容,如果未能解决你的问题,请参考以下文章

HttpWebrequest 失败,内部异常身份验证失败,因为远程方已关闭传输流

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

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

身份验证失败,因为远程方已关闭传输流 - 发送 smtp 错误

推送通知上的错误“身份验证失败,因为远程方已关闭传输流”

HTTP Get 请求错误“身份验证失败,因为远程方已关闭传输流。”