143 votes

Erreur Powershell v3 Invoke-WebRequest HTTPS

En utilisant les méthodes Invoke-WebRequest et Invoke-RestMethod de Powershell v3, j'ai réussi à utiliser la méthode POST pour envoyer un fichier json à un site web https.

La commande que j'utilise est

 $cert=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("cert.crt")
 Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert -Body $json -ContentType application/json -Method POST

Cependant, lorsque j'essaie d'utiliser la méthode GET comme :

 Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert -Method GET

L'erreur suivante est renvoyée

 Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.
 At line:8 char:11
 + $output = Invoke-RestMethod -Uri https://IPADDRESS/resource -Credential $cred
 +           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest)      [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

J'ai essayé d'utiliser le code suivant pour ignorer le certificat SSL, mais je ne suis pas sûr qu'il fasse quoi que ce soit.

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

Quelqu'un peut-il fournir des conseils sur ce qui pourrait se passer ici et sur la façon de le réparer ?

Gracias

8voto

La méthode suivante a fonctionné pour moi (et utilise les derniers moyens non dépréciés pour interagir avec la fonctionnalité SSL Certs/callback), et ne tente pas de charger le même code plusieurs fois dans la même session powershell :

if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
{
$certCallback=@"
    using System;
    using System.Net;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    public class ServerCertificateValidationCallback
    {
        public static void Ignore()
        {
            if(ServicePointManager.ServerCertificateValidationCallback ==null)
            {
                ServicePointManager.ServerCertificateValidationCallback += 
                    delegate
                    (
                        Object obj, 
                        X509Certificate certificate, 
                        X509Chain chain, 
                        SslPolicyErrors errors
                    )
                    {
                        return true;
                    };
            }
        }
    }
"@
    Add-Type $certCallback
 }
[ServerCertificateValidationCallback]::Ignore();

Cet article a été adapté de l'article suivant https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/

5voto

Aaron D Points 2585

J'ai constaté que lorsque j'ai utilisé la fonction de rappel suivante pour ignorer les certificats SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

J'ai toujours eu le message d'erreur Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. ce qui ressemble aux résultats que vous obtenez.

J'ai trouvé ceci post de forum ce qui m'a conduit à la fonction ci-dessous. Je l'exécute une fois dans la portée de mon autre code et cela fonctionne pour moi.

function Ignore-SSLCertificates
{
    $Provider = New-Object Microsoft.CSharp.CSharpCodeProvider
    $Compiler = $Provider.CreateCompiler()
    $Params = New-Object System.CodeDom.Compiler.CompilerParameters
    $Params.GenerateExecutable = $false
    $Params.GenerateInMemory = $true
    $Params.IncludeDebugInformation = $false
    $Params.ReferencedAssemblies.Add("System.DLL") > $null
    $TASource=@'
        namespace Local.ToolkitExtensions.Net.CertificatePolicy
        {
            public class TrustAll : System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult(System.Net.ServicePoint sp,System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem)
                {
                    return true;
                }
            }
        }
'@ 
    $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
    $TAAssembly=$TAResults.CompiledAssembly
    ## We create an instance of TrustAll and attach it to the ServicePointManager
    $TrustAll = $TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager]::CertificatePolicy = $TrustAll
}

1voto

Sunny Chakraborty Points 212

J'ai essayé de chercher de la documentation sur l'API REST OpenSource d'EM7. Rien pour l'instant.

http://blog.sciencelogic.com/sciencelogic-em7-the-next-generation/05/2011

On parle beaucoup de l'API REST OpenSource, mais il n'y a pas de lien vers l'API réelle ni de documentation. Peut-être que j'étais impatient.

Voici quelques éléments que vous pouvez essayer

$a = Invoke-RestMethod -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert 
$a.Results | ConvertFrom-Json

Essayez ceci pour voir si vous pouvez filtrer les colonnes que vous obtenez de l'API.

$a.Results | ft

ou, vous pouvez aussi essayer d'utiliser ceci

$b = Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert 
$b.Content | ConvertFrom-Json

En-têtes de style de boucles

$b.Headers

J'ai testé l'IRM / IWR avec l'api twitter JSON.

$a = Invoke-RestMethod http://search.twitter.com/search.json?q=PowerShell 

J'espère que cela vous aidera.

0voto

Jeremy Cook Points 2236

Ces paramètres de registre affectent .NET Framework 4+ et donc PowerShell. Définissez-les et redémarrez toutes les sessions PowerShell pour utiliser la dernière version de TLS, sans avoir à redémarrer.

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 

Voir https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#schusestrongcrypto

-1voto

  1. Exécutez cette commande

New-SelfSignedCertificate -certstorelocation cert : \localmachine\my -dnsname {votre nom d'hôte du site}

dans powershell en utilisant droits admin. Ceci va générer tous les certificats dans le répertoire personnel

  1. Pour se débarrasser de l'erreur de confidentialité, sélectionnez ces certificats, cliquez à droite sur Copier. Et collez dans Autorité de certification racine de confiance/Certificats.
  2. La dernière étape consiste à sélectionner les liaisons correctes dans IIS. Allez sur le site web de IIS, sélectionnez Bindings, cochez la case SNI et définissez les certificats individuels pour chaque site web.

Assurez-vous que le nom d'hôte du site Web et le nom dns du certificat correspondent exactement.

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