我正在尝试使用wget / invoke-webrequest浏览嵌入式Web服务器上的命令。如何避免该错误?

wget:服务器犯了协议(protocol)冲突。 Section = ResponseHeader Detail = CR必须跟随LF

已经尝试了多种方法,例如下面没有成功:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

当改用BITS时,这是我得到的错误

start-bitstransfer:服务器未返回文件大小。该URL可能指向动态内容。 Content-Length header 在
服务器的HTTP回复。

非常感谢你的帮助
克莱姆

最佳答案

设置ServerCertificateValidationCallback委托(delegate)将无济于事-SSL / TLS不是所引用的协议(protocol)-协议(protocol)违规是关于 HTTP header 的(例如,在TLS建立很久之后)。

有一个.NET configuration flag called useUnsafeHeaderParsing ,用于控制是否忽略此类违规。

使用反射,也可以在运行时进行设置。 This Technet forum answer给出了一个很好的示例,说明如何在PowerShell中执行此操作,我们可以将其包装在一个漂亮的函数中,如下所示:

function Set-UseUnsafeHeaderParsing
{
    param(
        [Parameter(Mandatory,ParameterSetName='Enable')]
        [switch]$Enable,

        [Parameter(Mandatory,ParameterSetName='Disable')]
        [switch]$Disable
    )

    $ShouldEnable = $PSCmdlet.ParameterSetName -eq 'Enable'

    $netAssembly = [Reflection.Assembly]::GetAssembly([System.Net.Configuration.SettingsSection])

    if($netAssembly)
    {
        $bindingFlags = [Reflection.BindingFlags] 'Static,GetProperty,NonPublic'
        $settingsType = $netAssembly.GetType('System.Net.Configuration.SettingsSectionInternal')

        $instance = $settingsType.InvokeMember('Section', $bindingFlags, $null, $null, @())

        if($instance)
        {
            $bindingFlags = 'NonPublic','Instance'
            $useUnsafeHeaderParsingField = $settingsType.GetField('useUnsafeHeaderParsing', $bindingFlags)

            if($useUnsafeHeaderParsingField)
            {
              $useUnsafeHeaderParsingField.SetValue($instance, $ShouldEnable)
            }
        }
    }
}

然后像这样使用:
Set-UseUnsafeHeaderParsing -Enable

在调用Invoke-WebRequest之前

08-26 23:19
查看更多