Powershell Invoke-RestMethod sur HTTPS
Je suis en train de communiquer avec un service sur powershell, mais je suis misérablement. Je soupçonne que c'est le certificat et j'ai googlé pour la réponse et a trouvé deux options, aucun n'a fonctionné pour moi. J'ai également essayé de combiner les deux sans succès.
Option 1:
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
$urlJSON = "https://internal.ad.local/path/api_jsonrpc.php"
#Create authentication JSON object using ConvertTo-JSON
$objAuth = (New-Object PSObject | Add-Member -PassThru NoteProperty jsonrpc '2.0' |
Add-Member -PassThru NoteProperty method 'user.authenticate' |
Add-Member -PassThru NoteProperty params @{user="user";password="password"} |
Add-Member -PassThru NoteProperty id '2') | ConvertTo-Json
Invoke-RestMethod -Uri $urlJSON -body $objAuth -method "Post"
Option 2:
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$urlJSON = "https://internal.ad.local/path/api_jsonrpc.php"
#Create authentication JSON object using ConvertTo-JSON
$objAuth = (New-Object PSObject | Add-Member -PassThru NoteProperty jsonrpc '2.0' |
Add-Member -PassThru NoteProperty method 'user.authenticate' |
Add-Member -PassThru NoteProperty params @{user="user";password="password"} |
Add-Member -PassThru NoteProperty id '2') | ConvertTo-Json
Invoke-RestMethod -Uri $urlJSON -body $objAuth -method "Post"
Voici le message d'erreur:
Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.
At C:\Users\user\AppData\Local\Temp6eaa6f7-62a0-4c10-88d1-79212d652bc9.ps1:24 char:1
+ Invoke-RestMethod -Uri $urlJSON -body $objAuth -method "Post"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
Je pourrais ajouter:
- surf directement le service fonctionne avec un navigateur web
- J'ai essayé d'ouvrir à l'adresse HTTP en tant que bien, et qui a travaillé
- Le certificat utilisé par le service est auto-signé, mais la confiance de mon ordinateur par le biais d'une racine certficate (aucun avertissement n'est émis dans IE ou Chrome)
- J'ai fait des captures de réseau et fait en sorte qu'un des paquets, en effet, atteindre le serveur.
Des suggestions apprécié!
Salutations,
Patrik
Mis à jour le post que les suggestions faites par M. Arbre ci-dessous:
Name : lambda_method
DeclaringType :
ReflectedType :
Module : RefEmit_InMemoryManifestModule
MethodHandle :
Attributes : PrivateScope, Public, Static
CallingConvention : Standard
IsSecurityCritical : False
IsSecuritySafeCritical : False
IsSecurityTransparent : True
ReturnType : System.Boolean
ReturnParameter :
ReturnTypeCustomAttributes : System.Reflection.Emit.DynamicMethod+RTDynamicMethod+EmptyCAHolder
MemberType : Method
MethodImplementationFlags : NoInlining
IsGenericMethodDefinition : False
ContainsGenericParameters : False
IsGenericMethod : False
IsPublic : True
IsPrivate : False
IsFamily : False
IsAssembly : False
IsFamilyAndAssembly : False
IsFamilyOrAssembly : False
IsStatic : True
IsFinal : False
IsVirtual : False
IsHideBySig : False
IsAbstract : False
IsSpecialName : False
IsConstructor : False
CustomAttributes :
MetadataToken :
Mise à jour 2 sur la base d'un commentaire par M. de l'Arbre:
Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.
At C:\Users\user\AppData\Local\Temp\ff47910e-fd8e-4be8-9241-99322144976a.ps1:13 char:1
+ Invoke-RestMethod -Uri $urlJSON -body $objAuth -method "Post"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
source d'informationauteur PatrikJ
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le mystère lors de la résolution d'une autre chose. Le serveur web en question uniquement pris en charge TLS1.1 et TLS1.2. Powershell ne semble PAS le supporter. Si j'ai activé TLS1.0 il a travaillé.
À force TLS1.2 vous pouvez utiliser cette ligne:
Espère que ça aide quelqu'un d'autre et merci pour tous les commentaires utiles!
/Patrik
Il semble que vous essayez d'appeler une API json avec
Invoke-RestMethod
. Selon le la documentation:D'utiliser un json corps, vous aurez besoin d'utiliser
Invoke-RestMethod -ContentType 'application/json' <other args>
Je suis passé par beaucoup de douleur récemment afin d'obtenir le passé une situation similaire. J'ai été la création d'une preuve de concept à l'aide d'un essai de SaaS. Le service a eu un certificat SSL auto-signé, donc je voulais ignorer les erreurs de certificat lors de la tentative d'invoquer une méthode POST (similaire à l'option "-k" paramètre de roulage). Après une lutte beaucoup, j'ai trouvé qu'elle avait besoin de les deux - (a) l'appel d'ignorer cert erreurs de validation et (b) de la définition explicite de TLS 1.2, comme le protocole de sécurité. Je pense que la dernière parce que le service était peut-être la baisse des tentatives pour se connecter à l'aide de l'un des autres protocoles. (J'ai passé trop de temps à essayer différentes variations pour chaque comme l'a suggéré sur divers SOF threads, mais indépendamment...)
Voici le code qui a travaillé...
Important: Le cert de validation de dérivation est purement pour le prototype/PoC. Nous n'avons pas l'intention de le faire dans la production (et vous ne devriez pas non plus!).
Tiens aussi à ajouter que la pratique des protocoles de sécurité évoluer à mesure que les différentes vulnérabilités sont découvertes et les correctifs mis en œuvre. En outre, les différents systèmes (SSL/TLS piles dans les Systèmes d'exploitation client et les serveurs/services) ont souvent leurs propres rattrapage à faire avec les plus récentes/les plus sécurisés options. Donc exactement ce qui du pavillon pourrait le travail sera fonction du client et des systèmes de serveur et aussi de temps (que TLS1.2 pourrait ne pas rester préféré quelques mois plus tard). Idéalement, on ne devrait pas avoir besoin de spécifier un drapeau. Veuillez voir la section "Remarques" dans ce document MSDN pour plus d'.