Powershell 3.0 Invoke-WebRequest HTTPS Échoue sur Toutes les Demandes
Je suis en train de travailler avec nos répartiteur de Charge via Powershell 3.0 et une API REST. Cependant, je suis actuellement un échec, peu importe ce que j'essaie si c'est une requête https, que ce soit à notre programme d'équilibrage de charge ou de tout autre site en https. J'ai l'impression de rater quelque chose d'évident.
Voici le code qui échoue avec https
try
{
#fails
#$location='https://www.bing.com'
#fails
#$location='https://www.google.com'
#fails
#$location='https://www.facebook.com'
#fails
#$location='https://www.ebay.com'
#works
#$location='http://www.bing.com'
#works
#$location='http://www.google.com'
#fails (looks like Facebook does a redirect to https://)
$location='http://www.facebook.com'
#works
#$location='http://www.ebay.com'
$response=''
$response = Invoke-WebRequest -URI $location
$response.StatusCode
$response.Headers
}
catch
{
Write-Host StatusCode $response.StatusCode
Write-Host $_.Exception
}
L'erreur que j'obtiens est:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.Management.Automation.PSInvalidOperationException:
There is no Runspace available to run scripts in this thread. You can provide one in the DefaultRunspace property of the System.Management.Automation.Runspaces.Runspa
ce type. The script block you attempted to invoke was: $true
at System.Net.TlsStream.EndWrite(IAsyncResult asyncResult)
at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.GetResponse(WebRequest request)
at Microsoft.PowerShell.Commands.WebRequestPSCmdlet.ProcessRecord()
J'espérais cette page et les suggestions vers le bas, y compris celui d'Aaron D.) serait de faire une différence, mais aucun d'entre eux fait une différence.
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
et
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
}
et
add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
J'ai essayé de commutation à Invoquer-RestCommand mais en vain je reçois la même réponse.
Il se sent comme ce doit être quelque chose pour l'environnement, parce que je ne peux pas croire que le ci-dessus ne fonctionne pas pour quelqu'un d'autre, mais je l'ai essayé sur un poste de travail et sur un serveur avec les mêmes résultats (n'exclut pas de environnement complètement, mais je sais qu'ils ont été mis en place différemment).
Toutes les pensées?
Invoke-RestMethod -Uri "https://gdata.youtube.com/feeds/api/videos?v=2&q=PowerShell"
fonctionne sur Windows Server 2012 avec un PSVersion de 3 0 -1 -1 Ne fonctionne pas sur Windows Server 2008 R2 avec un PS en Version 3 0 -1 -1 Et aussi ne fonctionne pas sur Windows 8.1 avec une version de 4 0 -1 -1
OriginalL'auteur mapeterson42 | 2014-08-05
Vous devez vous connecter pour publier un commentaire.
Cela a fonctionné parfaitement pour moi. Les valeurs par défaut du site de TLS 1.0 et apparemment PS ne fonctionne pas avec qui. J'ai utilisé cette ligne:
Mon PS scripts (pour l'instant tout ce que j'ai testé) ont travaillé à la perfection.
Cette réponse a fonctionné pour moi, mais pourriez-vous intégrez le blog post de texte dans la réponse que le lien n'est pas valide.
si vous google le lien, vous pouvez consulter la version en cache de la page... il était tout simplement un autre billet de blog à propos de quelqu'un qui cherche quelque chose de similaire. Je l'ai essayé.. et cela a fonctionné... j'ai donc été référencement où j'ai trouvé l'information. La page n'est plus apparemment. Je ne veux pas coller l'intégralité de la page ici.. comme il a été assez longue. J'ai créé un pastebin de la page... bon pour les mois à partir d'aujourd'hui pastebin.com/LQp8hsfq... si vous pensez qu'il devrait être posté ici.. laissez-moi savoir
merci @DanielPeel
OriginalL'auteur Daniel Peel
La réponse est de ne pas faire cela pour résoudre le problème SSL:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Si vous faites cela, votre première https demande de travail (il me semble), mais les suivantes ne le seront pas. De plus, à ce stade, vous avez besoin de fermer le Powershell ISE, et rouvrez-le et essayez à nouveau (sans cette ligne).
C'est fait allusion dans une phrase ici http://social.technet.microsoft.com/Forums/windowsserver/en-US/79958c6e-4763-4bd7-8b23-2c8dc5457131/sample-code-required-for-invokerestmethod-using-https-and-basic-authorisation?forum=winserverpowershell - "Et toutes les pistes de produire cette erreur :", mais il n'était pas clair quelle est la solution pour réinitialiser était.
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
De définir explicitement le protocole TLS 1.2 a fonctionné pour moi:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
OriginalL'auteur mapeterson42
Moi aussi j'ai été tourmenté par ce pour un très long moment. Il a même touché Visual Studio VS chargé mon
$PROFILE
dans ce domaine lors de l'exécution de NuGet restaurer.De voir votre commentaire ci-dessus m'a fait réaliser que j'avais un custom script de callback à cause de l'un de nos vendeurs livré un produit avec une défaillance de CN dans ssl cert.
Longue histoire courte, j'ai remplacé mon script délégué à la compilation d'un objet de c# (suppression de l'instance d'exécution de script à partir de l'équation).
(séparée bloc de code pour C# mettre en évidence)
En Powershell:
OriginalL'auteur Joachim Brandon LeBlanc