43 votes

Une erreur inattendue s'est produite en exécutant une simple requête Rest non autorisée

J'ai un point d'accès au repos qui n'effectue pas de contrôle d'authentification. Je peux exécuter une simple commande curl depuis Linux :

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

Cela répond.

Cependant, si j'essaye ce qui suit sur PowerShell, cela échoue :

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

Ensuite, j'obtiens :

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

Quelqu'un peut-il me dire comment contourner ce problème ?

EDIT :

Essai avec Invoke-WebRequest :

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

Invoke-WebRequest : La connexion sous-jacente a été fermée : Une erreur inattendue s'est produite lors d'un envoi. A la ligne: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

0 votes

Pourriez-vous simplement utiliser Invoke-WebRequest à la place ?

0 votes

J'aimerais pouvoir... Même erreur (je posterai le résultat dans Edit)

0 votes

Je vois que vous utilisez https, les certs sont-ils correctement configurés ? Essayez d'abord d'exécuter ceci : "[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}", puis réessayez Invoke-webRequest.

90voto

dross Points 486

Utilisation :

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

Tiré de Powershell 3.0 Invoke-WebRequest HTTPS échoue sur toutes les requêtes .

0 votes

Merci ! C'était exactement ce dont j'avais besoin

0 votes

C'est de l'or ! Ça a marché comme un charme.

0 votes

15 000 vues incroyables... 48 votes positifs. Merci pour l'info.

22voto

Justin Points 171

Dans mon cas, l'astuce TLS n'a pas fonctionné, cela semble être un bug dans powershell. vous devez ajouter le callback utiliser du code .net au lieu d'un bloc de script .

#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
}

3 votes

Cela a fonctionné pour moi lors de la mise en place [System.Net.ServicePointManager]::ServerCertificateValidatio‌​nCallback = {$true} y [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy ne l'a pas fait.

0 votes

@justin Je ne comprends pas pourquoi ça a marché, mais ça a marché. Est-ce un problème de version de powershell ?

0 votes

@AndyArismendi utiliser {$true} fonctionne, mais vous pouvez avoir des problèmes s'il y a trop d'appels à https. c'est pourquoi vous avez besoin d'une classe compilée.

2voto

Anand Joshi Points 51
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12

Fonctionne sous Windows server 2016

Révision majeure mineure de la construction


5 1 17763 1007

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X