自从我开始尝试通过证书身份验证方法让 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
到目前为止我尝试过的:
我不明白发生了什么事,这让我发疯。以前有人遇到过这个问题吗?
我愿意接受所有建议,提前致谢。
终于找到了解决这个问题的方法:
基于此线程基于客户端证书的身份验证停止为 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
希望这能帮助那里的人。
感谢您的解决方案!它也解决了我的问题。
我们有很多服务器使用 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
我真的不知道,这重要与否,但这是我发现的唯一区别。
非常感谢。
有相同的错误,但原因不同。 我们注意到,身份验证失败发生在互联网访问也受到限制的计算机上。事实证明,如果服务器无法到达签名证书的 CRL,它将拒绝对客户端证书进行身份验证。 查找客户端证书上的
X509v3 CRL Distribution Points
属性(通过 openssl x509 -noout -text
管道传输证书以查看这些属性)并确保服务器可以访问该 URL。
使用 winrm 设置证书身份验证时出现相同的错误。发现问题是因为受信任的根存储上存在冲突的证书。从注册表项中删除此项(如果存在):Remove-ItemProperty -Pathregistry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL -Name ClientAuthTrustMode