TLS 握手失败,CurrentUser 工作,而 LocalMachine 不工作

Posted

技术标签:

【中文标题】TLS 握手失败,CurrentUser 工作,而 LocalMachine 不工作【英文标题】:TLS handshake failure, CurrentUser works while LocalMachine does not 【发布时间】:2021-11-14 02:16:47 【问题描述】:

我正在尝试将 WCF 客户端配置为使用证书与服务器进行安全通信。当证书位于 CurrentUser 证书存储区时,一切正常。我可以使用 Wireshark 查看握手是否发生,并且客户端/服务器通信按预期进行。

当我使用 LocalMachine 证书存储中的相同证书时,我收到错误 Could not establish secure channel for SSL/TLS with authority。使用 LocalMachine 证书存储时有什么特别需要考虑的吗?

这行得通:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="endpointCredentialBehavior">
          <clientCredentials>
            <clientCertificate findValue="certTest"
                               storeLocation="CurrentUser"
                               storeName="My"
                               x509FindType="FindBySubjectName"/>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
<system.serviceModel>

这不是:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="endpointCredentialBehavior">
          <clientCredentials>
            <clientCertificate findValue="certTest"
                               storeLocation="LocalMachine"
                               storeName="My"
                               x509FindType="FindBySubjectName"/>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
<system.serviceModel>

证书已签名,CA 证书放置在 CurrentUserLocalMachine 证书存储的 Trusted Root Certification Athorities 存储中.

【问题讨论】:

【参考方案1】:

原来,当证书添加到 LocalMachine 证书存储时,证书是由管理员帐户添加的。 但是当 WCF 客户端运行时,客户端以普通用户的身份运行。普通用户的帐户无权访问证书的私钥。为了完成 TLS 握手,用户必须有权访问私钥。

要让其他用户访问私钥,请右键单击证书管理器中的证书,然后选择:所有任务 -> 管理私钥... 对于具有关联私钥的证书,您只会看到“管理私钥...”选项。

【讨论】:

如果我理解正确,当有其他用户要访问时,证书权限需要向管理员申请,否则他们无法访问,您要过滤掉通过身份验证可以访问的用户机制。 据我了解,管理员是否有权访问并不重要。重要的部分是,如果用户 A 添加了私钥,但用户 B 将使用该私钥,则需要为用户 B 提供对私钥的显式访问权限。 是的,创建证书时也需要指定-sky exchange。

以上是关于TLS 握手失败,CurrentUser 工作,而 LocalMachine 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Websocket++ 错误:handle_transport_init 收到错误:TLS 握手失败

TLS 握手失败,但通信未关闭

尝试使用此代码在 TLS 上运行 TLS 时,为啥会出现握手失败?

TLS 致命:握手失败

最近的 Java 升级导致椭圆曲线服务器证书的 TLS 握手失败?

mqtt使用WebSocket over TLS(wss)握手失败