Server 2008 R2至2016的PowerShell CREDSSP认证TLS 1.2适配问题
解决Server A到Server B的CREDSSP认证TLS适配问题
首先得给你理清关键:你之前加的[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12之所以没用,是因为这个设置只针对.NET的HTTP请求组件,而CREDSSP认证依赖的WinRM连接用的是系统SCHANNEL库的配置,和这个.NET设置完全不相关。下面给你两个可行的解决方案,都不需要把Server A改成仅TLS1.2:
方案1:全局配置Server A的WinRM强制使用TLS1.2
这个方法会让Server A的WinRM客户端发起所有远程连接时优先使用TLS1.2,刚好匹配Server B的配置,同时不影响Server A其他服务的SSL/TLS协议设置:
- 用管理员权限打开PowerShell,运行以下命令配置注册表:
# 创建WinRM客户端TLS1.2的配置项(如果不存在的话) New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Client\Protocols\TLS 1.2" -Force | Out-Null # 启用TLS1.2协议 Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Client\Protocols\TLS 1.2" -Name "Enabled" -Value 1 -Type DWORD # 禁用未加密的WinRM连接(可选但推荐提升安全性) Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Client" -Name "AllowUnencrypted" -Value 0 -Type DWORD # 重启WinRM服务使设置生效 Restart-Service WinRM -Force
- 配置完成后,直接运行你原来的脚本即可,不需要再加那个.NET的设置。
方案2:会话级临时强制WinRM使用TLS1.2
如果你不想修改Server A的全局配置,可以在每次发起连接时通过会话选项指定TLS1.2,这个设置只对当前会话有效:
修改你的脚本如下:
$pass = ConvertTo-SecureString "password" -asplaintext -force $mycred = New-Object -typename System.Management.Automation.PSCredential -argumentlist "domain\user.service",$pass # 创建WinRM会话选项,明确指定使用TLS1.2 $sessionOptions = New-PSSessionOption -Protocol TLS12 # 带上会话选项发起CREDSSP认证的命令 Invoke-Command -ComputerName ServerB.domain.edu -Command { C:\HelloWorld.ps1 } -Authentication Credssp -Credential $mycred -SessionOption $sessionOptions
注意:Server A是PowerShell V3,
New-PSSessionOption的-Protocol参数在PSv3中已经支持,所以这个方法是可行的。
额外验证步骤(可选)
为了确保Server B的配置没问题,可以在Server B上用管理员权限运行以下命令检查:
# 检查WinRM服务是否启用了TLS1.2 Get-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service\Protocols\TLS 1.2" # 检查CREDSSP是否已启用为接收方 Get-WSManCredSSP
如果CREDSSP接收方未启用,运行Enable-WSManCredSSP -Role Server -Force即可(不过你说全开TLS时能正常工作,这个应该已经配置好了)。
内容的提问来源于stack exchange,提问作者moore1emu
相关产品推荐
相关产品推荐

