证书授权。 :指定的凭据被服务器拒绝

问题描述 投票:0回答:4

自从我开始尝试通过证书身份验证方法让 Ansible 能够访问我的所有 Windows 主机以来,已经过去很多天了。我使用脚本来配置 WinRM 并创建自签名证书。在多个主机上,它工作正常,脚本完成后,我可以通过证书身份验证连接到它们,但在其他主机上(例如其中 15-20%)这是不可能的。

我收到此错误消息:

fatal: [SERVERNAME]: UNREACHABLE! => {
    "changed": false,
    "msg": "certificate: the specified credentials were rejected by the server",
    "unreachable": true
}

奇怪的是我在Windows事件查看器中没有看到登录事件。这是我的 WinRM 配置:

Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerationTimeoutms = 240000
    MaxConnections = 300
    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = false
    Auth
        Basic = true
        Kerberos = true
        Negotiate = true
        Certificate = true
        CredSSP = true
        CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *
    EnableCompatibilityHttpListener = false
    EnableCompatibilityHttpsListener = false
    CertificateThumbprint
    AllowRemoteAccess = true
Winrs
    AllowRemoteShellAccess = true
    IdleTimeout = 7200000
    MaxConcurrentUsers = 10
    MaxShellRunTime = 2147483647
    MaxProcessesPerShell = 25
    MaxMemoryPerShellMB = 1024
    MaxShellsPerUser = 30

监听器和证书映射均在windows机器上配置:

Listener
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint = 927...C26E
    ListeningOn = 127.0.0.1, 172.20.x.x

CertMapping
    URI = *
    Subject = ansibleuser@localhost
    Issuer = 579f3eb1c3756339a246843f70e1a89b14fdc244
    UserName = ansibleuser
    Enabled = true
    Password

到目前为止我尝试过的:

  • 检查 LocalAccountTokenFilterPolicy 注册表项是否存在
  • 通过 winrm configSDDL 默认配置对 WinRM 的访问
  • 检查 GPO
  • 更改密码(勾选和取消勾选密码永不过期, 等等...)
  • 创建另一个本地管理员用户
  • 启用基本和未加密的身份验证
  • 将连接类型更改为专用(由于服务器 已加入域)
  • 运行ansible提供的脚本来配置WinRM

我不明白发生了什么事,这让我发疯。以前有人遇到过这个问题吗?

我愿意接受所有建议,提前致谢。

ansible
4个回答
3
投票

终于找到了解决这个问题的方法:

基于此线程基于客户端证书的身份验证停止为 PS Remoting 工作,我发现名为“ClientAuthTrustMode”的注册表项应设置为值“2”,这样错误消息就会神奇地消失。

这里有一篇 Microsoft 文章详细介绍了该密钥的含义:TLS 概述 - SSL (Schannel SSP)

这是一个简单的 powershell 命令来翻转开关:

Set-ItemProperty -Path registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL -Name ClientAuthTrustMode -Type DWord -Value 2

希望这能帮助那里的人。


0
投票

感谢您的解决方案!它也解决了我的问题。

我们有很多服务器使用 ansible 和 WINRM 以及基于证书的身份验证,但我们只有一台服务器存在与您相同的问题...

我在您的共享设置中发现的唯一一个有趣的区别是: 监听 = 127.0.0.1, 172.20.x.x 这也和我的一样... localhost 是第一位的... 监听 = 127.0.0.1, 19x.1xx.19.98,::1

我们设置中的其他服务器首先添加网络接口,如下所示: 监听 = 19x.16.61.38,127.0.0.1,::1

我真的不知道,这重要与否,但这是我发现的唯一区别。

非常感谢。


0
投票

有相同的错误,但原因不同。 我们注意到,身份验证失败发生在互联网访问也受到限制的计算机上。事实证明,如果服务器无法到达签名证书的 CRL,它将拒绝对客户端证书进行身份验证。 查找客户端证书上的

X509v3 CRL Distribution Points
属性(通过
openssl x509 -noout -text
管道传输证书以查看这些属性)并确保服务器可以访问该 URL。


0
投票

使用 winrm 设置证书身份验证时出现相同的错误。发现问题是因为受信任的根存储上存在冲突的证书。从注册表项中删除此项(如果存在):Remove-ItemProperty -Pathregistry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL -Name ClientAuthTrustMode

© www.soinside.com 2019 - 2024. All rights reserved.