证书验证.:指定的凭据被服务器拒绝



自从我开始尝试通过证书认证方法使我所有的Windows主机都可以通过Ansible访问以来,已经有好几天了。我使用一个脚本来配置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 default配置WinRM的访问权限
  • 检查gpo
  • 更改密码(选中和取消选中密码永不过期,等)
  • 创建另一个本地管理用户
  • 启用基本和未加密认证
  • 将连接类型更改为私有(由于服务器无法连接)
  • 运行ansible提供的脚本配置WinRM

我不明白这是怎么回事,快把我逼疯了。以前有人遇到过这个问题吗

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

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

基于这个线程的基于客户端证书的身份验证停止为PS Remoting工作,我发现一个名为"clientauthtrustmode"的注册表项。应该设置为值"2";这样,错误信息就神奇地消失了。

这是一篇微软的文章,详细介绍了密钥的含义:TLS - SSL(通道SSP)概述

下面是一个简单的powershell命令来打开开关:

Set-ItemProperty -Path registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNEL -Name ClientAuthTrustMode -Type DWord -Value 2

希望这能帮助到一些人。

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

我们有很多服务器使用基于证书的身份验证的ansible和WINRM,但只有一个服务器有和你的相同的问题…

唯一一个有趣的区别,我发现你的共享设置是这样的:ListeningOn = 127.0.0.1, 172.20.x.x这也和我的一样…Localhost是第一位的……ListeningOn =127.0.0.1, 19. xx.19.98,::1

在我们的设置中,其他服务器在第一个地方添加网络接口,像这样:19 x.16.61.38 ListeningOn =,127.0.0.1,:: 1

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

谢谢你。