参考:https://docs.ansible.com/ansible/latest/os_guide/windows_winrm.html#tls-1-2-support
使用WinRMl连接主机报错:
1 | HTTPSConnectionPool(host='server', port=5986): Max retries exceeded with url: /wsman (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1056)'))) |
报错原因SSL协议版本不支持,需要升级服务器使用TLS v1.2或以上版本。Windows 8和Windows Server 2012默认安装并启用了TLS v1.2,但像Server 2008 R2和Windows 7这样的旧主机必须手动启用(这里待确认,发现Windows Server 2012 R2 也没有开启)。
1 验证 Windows 主机支持的协议:
1 | openssl s_client -connect <hostname>:5986 |
输出将包含有关TLS会话的信息,协议行将显示已经协商的版本:
1 | Connecting to 172.16.52.159 |
如果主机返回的是TLSv1,则应配置为启用TLS v1.2。您可以通过运行以下PowerShell脚本来实现这一点:(注意需要重启)
1 | Function Enable-TLS12 { |
2 查看服务器SSL/TLS配置
在Windows服务器上,WinRM服务的SSL/TLS配置通常是由Windows操作系统的Schannel组件来处理的,而不是由WinRM服务本身来处理。因此,需要查看Schannel的配置来了解WinRM服务的SSL/TLS配置。
以下是如何查看Schannel的SSL/TLS配置的步骤:
- 打开注册表编辑器(Regedit)。你可以在开始菜单中搜索”regedit”,然后点击”注册表编辑器”应用来打开它。
- 在注册表编辑器中,导航到以下路径:
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols |
- 在这个路径下,你应该能看到几个文件夹,比如”SSL 2.0”,”SSL 3.0”,”TLS 1.0”,”TLS 1.1”,”TLS 1.2”,”TLS 1.3”等。这些文件夹代表了服务器支持的SSL/TLS版本。
3 代码修改适配ssl2.0协议
配置TLS1.2 需要重启服务器,对于客户环境该要求过于理想,所以需要代码改造。
主要是重写 requests.HTTPAdapter
类的 init_poolmanager
方法,在 init_poolmanager
方法中,创建了一个新的 SSL 上下文,并配置该上下文以使用 TLSv1 协议。然后,它通过 ctx.options |= ssl.PROTOCOL_TLS
语句启用了对所有版本的 SSL 和 TLS 协议的支持。最后,它创建了一个新的 PoolManager
实例,并将创建的 SSL 上下文传递给这个实例:
1 | import ssl |
我们对Winrm进行改造:
1 | class WinrmExectuor(ExecutorBase, winrm.Session, metaclass=ExecutorMeta): |