PowerShell 运行 "irm https://get.activated.win | iex" 报错 "SSL/TLS 安全通道无法建立信任关系" 的解决方法

2024-09-22 Windows

一、错误现象

在 PowerShell 中运行 MAS 一键命令时,出现以下错误:

irm : 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。
所在位置 行:1 字符: 1
+ irm https://get.activated.win | iex
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod],WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

或在英文系统中显示为:

Invoke-RestMethod: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

二、错误含义

这个错误说明 PowerShell 能够连接到服务器,但 SSL/TLS 证书验证失败,系统不信任服务器的安全证书。

与上一篇文章讲的"无法识别 URI 前缀"不同——那个是连 URL 都解析不了,这个是连接已建立但证书不受信任。

三、常见原因

原因 说明
系统时间不准确 证书有有效期,时间偏差过大会导致证书被认为已过期或尚未生效
系统根证书过期 Windows 7 / 8 的根证书列表未更新,无法验证现代 CA 证书
TLS 版本过低 服务器要求 TLS 1.2+,但系统默认只协商 TLS 1.0
缺少 SHA-2 签名支持 旧版 Windows 7 未安装 KB4474419 更新,不支持 SHA-2 签名的证书
代理/防火墙中间人 公司网络或杀毒软件做了 SSL 中间人劫持,替换了服务器证书
证书吊销检查失败 系统无法访问 CRL(证书吊销列表)分发点,例如在中国大陆无法访问 ocsp.digicert.com

四、排查步骤

步骤 1:检查系统时间(最简单也最容易中招)

# 查看当前系统时间
Get-Date

确保:

  • 年、月、日完全正确
  • 时区正确(中国为 UTC+8)
  • 与手机或实际时间对比

修正方法:

# 同步网络时间
net stop w32time
w32tm /unregister
w32tm /register
net start w32time
w32tm /resync

或者在图形界面:设置 → 时间和语言 → 日期和时间 → 开启 自动设置时间,然后点击 立即同步。

时间差超过 5 分钟就会导致证书验证失败。

步骤 2:测试 TLS 连接(确认是否能连接)

# 测试能否建立 TCP 连接
Test-NetConnection get.activated.win -Port 443

如果 TcpTestSucceeded: True,说明网络连接没问题,问题出在证书验证环节。

步骤 3:查看服务器证书详情

# 使用 .NET 类获取服务器证书信息
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
$request = [Net.WebRequest]::Create("https://get.activated.win")
$request.GetResponse()
$cert = $request.ServicePoint.Certificate
$cert.Subject
$cert.Issuer
$cert.GetExpirationDateString()

这会显示证书的签发者、主题和有效期,帮助判断是否是证书过期或被替换。

步骤 4:强制使用 TLS 1.2(最常见解决方案)

Windows 7 和 Windows 8 默认不启用 TLS 1.2,需要手动开启:

# 在运行 irn 命令之前执行
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

# 再运行 MAS
irm https://get.activated.win | iex

如果可行,建议将这段写入 PowerShell 配置文件,永久生效:

# 添加到当前用户的 PowerShell 配置文件
$profilePath = "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
$tlsLine = '[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13'
Add-Content -Path $profilePath -Value "`n$tlsLine" -ErrorAction SilentlyContinue

步骤 5:忽略证书验证(临时绕过,不推荐长期使用)

# 忽略所有证书验证错误
[Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }

# 再运行
irm https://get.activated.win | iex

⚠️ 注意:这会禁用所有 HTTPS 证书验证,包括恶意网站。仅在临时排障时使用,用完后重置:

[Net.ServicePointManager]::ServerCertificateValidationCallback = $null

步骤 6:使用 WinHTTP 代替 .NET WebRequest

PowerShell 的 irm 默认使用 .NET 的 WebRequest,在旧系统上 SSL/TLS 支持有限。改用 WinHttpRequest COM 对象:

# 使用 WinHTTP COM 对象下载脚本
$http = New-Object -ComObject WinHttp.WinHttpRequest.5.1
$http.Open("GET", "https://get.activated.win", $false)
$http.SetTimeouts(30000, 30000, 30000, 30000)
$http.Send()
$scriptContent = $http.ResponseText

# 保存到临时文件再执行
$scriptContent | Out-File -FilePath "$env:TEMP\MAS.ps1" -Encoding utf8
& "$env:TEMP\MAS.ps1"

WinHTTP 使用系统级 HTTP 堆栈,不受 .NET 的 TLS 版本限制。

步骤 7:安装 Windows 更新

Windows 7 SP1

必须安装以下更新才能支持 TLS 1.2 和 SHA-2 证书:

KB 编号 说明 下载
KB4474419 SHA-2 签名支持(2019 年 9 月) Microsoft Catalog
KB4490628 服务堆栈更新 Microsoft Catalog
KB3140245 启用 TLS 1.2 的注册表更新 Microsoft Catalog

安装完成后,修改注册表启用 TLS 1.2:

# 启用 TLS 1.2 客户端
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Force | Out-Null
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'DisabledByDefault' -Value 0
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client' -Name 'Enabled' -Value 1

# 启用 TLS 1.2 服务器
New-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Force | Out-Null
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'DisabledByDefault' -Value 0
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server' -Name 'Enabled' -Value 1

# 重启生效(或重启 PowerShell)
Restart-Computer

Windows 8.1

# 安装 KB3140245 即可
# 或直接安装最新的月度安全质量更新

步骤 8:更新根证书

即使系统时间正确、TLS 版本支持,也可能因为根证书列表过旧导致无法验证:

# 手动更新根证书
certutil -generateSSTFromWU roots.sst
certutil -addstore Root roots.sst
del roots.sst

Windows 7 建议安装 KB2813430(根证书更新)。

也可以下载微软的根证书更新包:

步骤 9:排除代理/防火墙中间人

如果是在公司网络、校园网或开启了 SSL 扫描的杀毒软件环境下,服务器证书可能被中间人替换。

检查方法:

# 通过浏览器访问
# 在浏览器打开 https://get.activated.win
# 点击地址栏的锁图标,查看证书颁发者

如果证书颁发者是内部 CA(如 Company-Proxy-CA)而非公开 CA,说明中间人劫持了 SSL 连接。

解决方法:

  • 临时退出 360、腾讯电脑管家、火绒等杀毒软件
  • 关闭 SSL 扫描功能(一般在杀毒软件的"网络安全"设置中)
  • 如果是公司网络,可以使用手机热点绕过

步骤 10:使用 PowerShell 7(终极方案)

PowerShell 7 基于 .NET Core,内置了更新的 TLS 和证书支持,不存在旧系统的兼容问题:

# 安装 PowerShell 7
winget install --id Microsoft.Powershell --source winget

# 或手动下载安装
# https://github.com/PowerShell/PowerShell/releases

安装后打开 PowerShell 7(pwsh) 再运行:

pwsh
irm https://get.activated.win | iex

PowerShell 7 默认支持 TLS 1.2 和 1.3,证书验证也更完善。

五、快速排查流程

┌─────────────────────────────┐
│ 出现 SSL/TLS 信任错误        │
└──────────┬──────────────────┘
           ▼
┌─────────────────────────────┐
│ 检查系统时间是否正确?       │
├──────────┬──────────────────┤
│   否     │    是            │
│ 同步时间 │    ▼             │
└──────────┘ ┌────────────────┐
             │ 强制 TLS 1.2   │
             ├──────┬─────────┤
             │ 可行 │ 不可行  │
             │ 完成 ├─────────┤
             │      │ 检查证书│
             │      │ 详情    │
             │      ├─────────┤
             │      │ 检查否  │
             │      │ 为 MS  │
             │      │ 更新   │
             │      ├─────────┤
             │      │ 升级    │
             │      │ PS 7    │
             │      ├─────────┤
             │      │ 本地下载│
             │      │ 保底    │
             └──────┴─────────┘

六、保底方案:完全绕过 irm

如果以上所有方法都不行,直接用浏览器或 curl 下载脚本:

# 使用 .NET WebClient(不受 PowerShell 版本限制)
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://get.activated.win", "$env:TEMP\MAS.ps1")
& "$env:TEMP\MAS.ps1"

或者使用 bitsadmin(Windows 自带后台智能传输服务):

bitsadmin /transfer masdownload /download /priority high https://get.activated.win %TEMP%\MAS.ps1
& "$env:TEMP\MAS.ps1"

七、新旧错误对比

错误 含义 解决方向
无法识别该 URI 前缀 URL 解析失败 手动输入命令,清理空格
SSL/TLS 安全通道信任关系 证书验证失败 时间、TLS 版本、根证书、更新

八、总结

"SSL/TLS 安全通道无法建立信任关系"的解决顺序:

  1. ⏰ 先看时间(80% 是这个问题)
  2. 🔒 强制 TLS 1.2(Windows 7/8 的标配问题)
  3. 📦 安装系统更新(KB4474419 + KB3140245)
  4. 🔄 升级 PowerShell 7(一劳永逸)
  5. 📥 本地下载(最终保底)

参考来源:massgrave.dev/troubleshoot、Microsoft .NET SSL/TLS 最佳实践