Unexpected error occurred running a simple unauthorized Rest query

36,908

Solution 1

Using:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Taken from Powershell 3.0 Invoke-WebRequest HTTPS Fails on All Requests.

Solution 2

in my case the TLS trick did not work, this seems to be a bug in powershell. you need to add the callback using .net code instead of a scriptblock.

#C# class to create callback
$code = @"
public class SSLHandler
{
    public static System.Net.Security.RemoteCertificateValidationCallback GetSSLHandler()
    {

        return new System.Net.Security.RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) => { return true; });
    }

}
"@

#compile the class
Add-Type -TypeDefinition $code

#disable checks using new class
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = [SSLHandler]::GetSSLHandler()
#do the request
try
{
    invoke-WebRequest -Uri myurl -UseBasicParsing
} catch {
    # do something
} finally {
   #enable checks again
   [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $null
}

Solution 3

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12

Works in Windows server 2016

Major Minor Build Revision


5 1 17763 1007

Share:
36,908
dross
Author by

dross

Updated on July 09, 2022

Comments

  • dross
    dross almost 2 years

    I have a rest endpoint that doesn't perform an authentication check. I can run a simple curl commmand from Linux:

    curl -k https://application/api/about
    

    This responds.

    However if try the following on PowerShell it fails:

    Invoke-RestMethod https://application/api/about
    

    Then I get:

    Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.
    At line:1 char:1
    + Invoke-RestMethod $Application
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
        + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
    

    Could some one please tell me how I can get around this problem ?

    EDIT:

    Trying with Invoke-WebRequest:

    Invoke-WebRequest -Uri "https://application/api/about"
    

    Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. At line:1 char:1 + Invoke-WebRequest -Uri "https://application/api/a ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

  • Jose Ortega
    Jose Ortega over 5 years
    Thank you! This was exactly what I needed
  • qJake
    qJake over 5 years
    This is gold! Worked like a charm.
  • Glenn Ferrie
    Glenn Ferrie about 5 years
    unbelievable 15K views... 48 up votes. thanks for the info.
  • Andy Arismendi
    Andy Arismendi about 5 years
    This worked for me while setting [System.Net.ServicePointManager]::ServerCertificateValidatio‌​nCallback = {$true} and [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy didn't.
  • aaaaaa
    aaaaaa about 5 years
    How did you know to set this value? I just want to know how we were all supposed to figure this out
  • Mark Schultheiss
    Mark Schultheiss about 5 years
    @aaaaaa - we figured it out by searching StackOverflow :) and found this answer
  • MonaLisaOverdrive
    MonaLisaOverdrive almost 5 years
    @justin I do not understand why this worked, but it did. Is it a powershell version issue?
  • Justin
    Justin almost 5 years
    @AndyArismendi using {$true} does work, but you can get yourself into trouble if there are too many calls to https. that is why you need a compiled class.
  • Justin
    Justin almost 5 years
    @MonaLisaOverdrive as far as i can tell it is a powershell issue, basically it keeps reloading the powershell runspace and eventually reaches a point where it can't.
  • ArNumb
    ArNumb over 4 years
    This setting is to be done during each PowerShell session. It works like a charm, thanks!
  • Dan Buhler
    Dan Buhler almost 4 years
    If you get a 'not recognized' error, I used [Net.ServicePointManager]::SecurityProtocol = 'Tls12' to accomplish the same thing.