PowerShell Invoke-RestMethod遇403禁止错误,CMD Curl正常求助
PowerShell Invoke-RestMethod 403 Forbidden 问题排查与解决
问题场景
使用PowerShell的Invoke-RestMethod执行GET请求时返回403 Forbidden错误,但相同参数的CMD curl命令可正常运行。同时在PS 5.1中尝试使用-SkipCertificateCheck参数时提示参数不存在。
PowerShell报错命令及结果
PS C:\Windows\system32> Invoke-RestMethod -Uri 'https://XXXXXXXXXXXXXXX.XXXX.XXX/YYYYY/ZZZZ/AAAA/BBBBB' -Method Get -Headers @{ 'Cookie' = 'AuthToken=XXXXXXXXXXXXXXXXXXXXXXXXX;' 'Referer' = 'https://XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC'} Invoke-RestMethod : The remote server returned an error: (403) Forbidden. At line:1 char:1 + Invoke-RestMethod -Uri 'https://XXXXXXXXX.XXXXXX.XXXX/YYYYY/ZZZZZ/AAA ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
可正常运行的CMD Curl命令
curl -i -k -X GET https://XXXXXXXXXXXXXXX.XXXX.XXX/YYYYY/ZZZZ/AAAA/BBBBB -H "Cookie: AuthToken=XXXXXXXXXXXXXXXXXXXXXXXXX;" -H "Referer: https://XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC"
PowerShell版本
PS C:\Windows\system32> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 5 1 22621 2506
额外错误信息
尝试添加-SkipCertificateCheck参数时的报错:
PS C:\Windows\system32> Invoke-RestMethod -Uri 'https://XXXXXXXXXXXXXXX.XXXX.XXX/YYYYY/ZZZZ/AAAA/BBBBB' -Method Get -Headers @{ 'Cookie' = 'AuthToken=XXXXXXXXXXXXXXXXXXXXXXXXX;' 'Referer' = 'https://XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC'} -SkipCertificateCheck Invoke-RestMethod : A parameter cannot be found that matches parameter name 'SkipCertificateCheck'. At line:3 char:72 + ... //XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC'} -SkipCertificateCheck + ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Invoke-RestMethod], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
解决方法
1. 处理证书验证问题(替代-SkipCertificateCheck)
PowerShell 5.1没有-SkipCertificateCheck参数,该参数是PowerShell 7+才引入的。而你的curl命令用了-k跳过证书验证,所以PS端需要手动禁用证书校验:
# 临时禁用证书验证 [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} # 执行请求 Invoke-RestMethod -Uri 'https://XXXXXXXXXXXXXXX.XXXX.XXX/YYYYY/ZZZZ/AAAA/BBBBB' -Method Get -Headers @{ 'Cookie' = 'AuthToken=XXXXXXXXXXXXXXXXXXXXXXXXX;' 'Referer' = 'https://XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC' } # 恢复证书验证(可选但推荐) [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null
2. 统一请求头(尤其是User-Agent)
Invoke-RestMethod默认的User-Agent和curl不同,部分服务器会校验这个字段。可以手动添加和curl一致的User-Agent:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} Invoke-RestMethod -Uri 'https://XXXXXXXXXXXXXXX.XXXX.XXX/YYYYY/ZZZZ/AAAA/BBBBB' -Method Get -Headers @{ 'Cookie' = 'AuthToken=XXXXXXXXXXXXXXXXXXXXXXXXX;' 'Referer' = 'https://XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC' 'User-Agent' = 'curl/7.88.1' # 替换为你实际的curl版本,可通过curl -V查看 } [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null
3. 调整Cookie格式
尝试去掉Cookie值末尾的分号,部分服务器对Cookie格式敏感:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} Invoke-RestMethod -Uri 'https://XXXXXXXXXXXXXXX.XXXX.XXX/YYYYY/ZZZZ/AAAA/BBBBB' -Method Get -Headers @{ 'Cookie' = 'AuthToken=XXXXXXXXXXXXXXXXXXXXXXXXX' # 去掉末尾的分号 'Referer' = 'https://XXXXXXXXX.XXXXX.XXXX/YYYYY/ZZZZZ/CCCCCC' 'User-Agent' = 'curl/7.88.1' } [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null
关键说明
- PowerShell 5.1基于
HttpWebRequest,而PowerShell 7+使用HttpClient,两者的默认行为和参数差异较大,-SkipCertificateCheck仅在7+版本可用。 - 服务器返回403通常是因为请求头不匹配、证书验证失败或权限校验问题,优先排查这几个方向。
内容的提问来源于stack exchange,提问作者Fyaz Manknojiya
相关产品推荐
相关产品推荐

