सवाल पावरहेल v3 Invoke-WebRequest HTTPS त्रुटि


पावरहेल v3 के Invoke-WebRequest और Invoke-RestMethod का उपयोग करके मैंने एक JSON फ़ाइल को https वेबसाइट पर पोस्ट करने के लिए POST विधि का सफलतापूर्वक उपयोग किया है।

मैं जिस कमांड का उपयोग कर रहा हूं वह है

 $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

हालांकि जब मैं जीईटी विधि का उपयोग करने का प्रयास करता हूं जैसे:

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

निम्नलिखित त्रुटि लौटा दी गई है

 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

मैंने एसएसएल प्रमाण को अनदेखा करने के लिए निम्न कोड का उपयोग करने का प्रयास किया है, लेकिन मुझे यकीन नहीं है कि यह वास्तव में कुछ भी कर रहा है या नहीं।

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

क्या कोई यहां कुछ गलत मार्गदर्शन कर सकता है कि यहां क्या गलत हो रहा है और इसे कैसे ठीक किया जा सकता है?

धन्यवाद


76
2017-07-27 23:39


मूल


तो आप किसका उपयोग कर रहे हैं? Invoke-RestMethod या Invoke-WebRequest? - svick
आह्वान-WebRequest। मैं इसका उपयोग करता हूं क्योंकि यह Invoke-RestMethod के विपरीत अनुरोध / resposne हेडर देता है। हालांकि मैंने Invoke-RestMethod को आजमाया है जो समान पैरामीटर भी लेता है। - floyd
इसके लायक होने के लिए, सर्वर वैलिडेशन कॉलबैक चीज लगभग निश्चित रूप से एक लाल हेरिंग है, क्योंकि जब आपके पास SSL सत्यापन समस्या shoudl है तो आपको यह त्रुटि मिलनी चाहिए कि: Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.  आप अधिक जानकारी के लिए $ त्रुटि [0] .xception.InnerException की खोज करने का प्रयास कर सकते हैं ... - Jaykul


जवाब:


यह काम मेरे आसपास काम किया: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

असल में, आपके पावरशेल स्क्रिप्ट में:

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

$result = Invoke-WebRequest -Uri "https://IpAddress/resource"

120
2018-04-05 19:20



नोट, यह जवाब सही है; हालांकि, एक और जवाब पर बिंदु (stackoverflow.com/a/25163476/68432) भी वैध है। यदि आपने "[System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true}" पहले किया है तो यह समाधान काम नहीं करेगा। - Paul Suart
यह मेरे लिए काम किया। - Trevor Sullivan
आपको नीचे आर्थर स्ट्रुटजेनबर्ग उत्तर के अनुसार टाइप हालत चेक जोड़ने की आवश्यकता है या आपको एक त्रुटि मिलेगी कि यह प्रकार पहले से मौजूद है - Ralph Willgoss
क्या उत्पादन में इसका उपयोग करने के लिए कोई सुरक्षा जोखिम है? - Amjad
5 साल बाद, यह अभी भी PowerShell 5.1 (पूर्ण .NET Framework) का समाधान है। PowerShell कोर के लिए एक है -SkipCertificateCheck अभी व। - evilSnobu


ली का जवाब बहुत अच्छा है, लेकिन मुझे भी समस्याएं थीं जिनके साथ वेब सर्वर समर्थित प्रोटोकॉल था।
निम्नलिखित पंक्तियों को जोड़ने के बाद, मैं https अनुरोध के माध्यम से प्राप्त कर सकता था। जैसा कि इस जवाब में बताया गया है https://stackoverflow.com/a/36266735

$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols

ली के कोड के साथ मेरा पूरा समाधान।

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;
    }
}
"@
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

32
2017-09-16 13:43



क्या आपको बेहतर समाधान मिला है, अगर आपके पास 40 स्क्रिप्ट हैं तो आपको इसे प्रत्येक में जोड़ना होगा? कोई समझ नहीं आता है। बीटीडब्ल्यू, उत्तर के लिए धन्यवाद - Ender
ली का जवाब मेरे लिए काम नहीं करता था। मुझे आपके द्वारा संदर्भित बिट्स और आईटी वर्क जोड़ना पड़ा! - Pat K
प्रोटोकॉल को निर्दिष्ट करने में समस्या को हल करने में मदद करने के लिए बहुत बहुत धन्यवाद - Alex
धन्यवाद, धन्यवाद, धन्यवाद मुझे धन्यवाद SecurityProtocol वैश्विक स्थैतिक संपत्ति। मसीह, मैंने अभी अस्पष्ट हल करने की कोशिश कर रहे अन्य चीजों के प्रमाण पत्र, ट्रस्ट, नेटवर्क, मार्ग, अनुमतियां और शिटलोड की जांच करने के दिन DAYS खो दिया है endpoint does not respondhttps (अन्य सभी काम करने के माध्यम से) के माध्यम से एक विशिष्ट सर्वर तक पहुंचने में त्रुटि, सिर्फ इसलिए कि उस पावर पावरहेल 5.1 को SSL3, TLS और यह केवल डिफ़ॉल्ट है ब्लाकों GodDAMN टीएलएस 11 और टीएलएस 12 डिफ़ॉल्ट रूप से ईश्वर मुझे इस बकवास से कितना नफरत है मुझे सी # / रूबी / सी ++ में उस स्क्रिप्ट को लिखा होगा, या जो कुछ भी शक्तिशक्ति नहीं है - quetzalcoatl
^ .... कम से कम WinServer2012R2 पर - quetzalcoatl


क्या आपने उपयोग करने का प्रयास किया था System.Net.WebClient?

$url = 'https://IPADDRESS/resource'
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential("username","password")
$wc.DownloadString($url)

8
2017-07-31 12:51



सनी, मुझे उस कोड का उपयोग करते समय निम्न प्राप्त होता है: "1" तर्क के साथ "डाउनलोडस्ट्रिंग" को अपवाद: "रिमोट सर्वर ने एक त्रुटि लौटा दी: (406) स्वीकार्य नहीं है।" लाइन पर: 4 char: 1 + $ wc.DownloadString ($ url) + ~~~~~~~~~~~~~~~~~~~~~~~~ + श्रेणीसूची: निर्दिष्ट नहीं: (:) [ ], MethodInvocationException + FullyQualifiedErrorId: WebException - floyd
आरईएसटी सेवा के एपीआई दस्तावेज के आधार पर 406 का उपयोग करते हुए मैं संकेत देता हूं कि अनुरोध में शामिल स्वीकृति हेडर एक्सएमएल या जेएसओएन प्रतिक्रिया की अनुमति नहीं देता है " - floyd
एक्सएमएल / जेएसओएन प्रतिक्रियाओं की अनुमति नहीं है तो किस प्रतिक्रिया प्रकार की अनुमति है? - Sunny Chakraborty
क्या यह एक कस्टम वेब सेवा है जिसका आप उपयोग कर रहे हैं? क्या आरईएसटी एपीआई के लिए कोई सार्वजनिक रूप से उपलब्ध दस्तावेज है? - Sunny Chakraborty
यह ईएम 7 नामक टिकटिंग सिस्टम है, मुझे विश्वास नहीं है कि उनके पास सार्वजनिक दस्तावेज़ हैं। सेवा JSON / XML प्रतिक्रिया स्वीकार करती है (अगर मैं curl का उपयोग करता हूं तो ठीक काम करता है) मुझे विश्वास है कि त्रुटि यह इंगित कर रही है कि System.Net.WebClient नहीं है? - floyd


मैंने पाया कि जब मैंने SSL कॉल प्रमाणपत्रों को अनदेखा करने के लिए इस कॉलबैक फ़ंक्शन का उपयोग किया था [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

मुझे हमेशा त्रुटि संदेश मिला Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. जो आपके पास होने वाले परिणामों की तरह लगता है।

मुझे मिला फोरम पोस्ट जो मुझे नीचे दिए गए समारोह में ले जाता है। मैं इसे अपने दूसरे कोड के दायरे में एक बार चलाता हूं और यह मेरे लिए काम करता है।

कार्य अनदेखा-एसएसएल प्रमाणपत्र
{
    $ प्रदाता = नया ऑब्जेक्ट माइक्रोसॉफ्ट .CSharp.CSharpCodeProvider
    $ कंपाइलर = $ प्रदाता.क्रेट कॉम्पलर ()
    $ पैराम्स = न्यू-ऑब्जेक्ट सिस्टम। कोडडॉम। कॉम्पलर। कॉम्पलर पैरामीटर
    $ Params.GenerateExecutable = $ झूठी
    $ Params.GenerateInMemory = $ true
    $ Params.IncludeDebugInformation = $ false
    $ पैराम्स। संदर्भित Assemblies.Add ("System.DLL")> $ शून्य
    $ TASource = @ '
        नेमस्पेस Local.ToolkitExtensions.Net.CertificatePolicy
        {
            पब्लिक क्लास ट्रस्टएल: System.Net.ICertificate पॉलिसी
            {
                सार्वजनिक बूल CheckValidationResult (System.Net.ServicePoint SP, System.Security.Cryptography.X509Certificates.X509 प्रमाण पत्र, System.Net.WebRequest req, int समस्या)
                {
                    सच वापसी;
                }
            }
        }
'@
    $ TAResults = $ Provider.CompileAssemblyFromSource ($ पैरामीटर, $ TASource)
    $ TAAssembly = $ TAResults.CompiledAssembly
    ## हम ट्रस्टएल का एक उदाहरण बनाते हैं और इसे ServicePointManager से संलग्न करते हैं
    $ TrustAll = $ TAAssembly.CreateInstance ("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager] :: प्रमाणपत्र नीति = $ TrustAll
}


4
2018-03-26 00:50





निम्नलिखित कार्यों ने मेरे लिए काम किया (और एसएसएल कर्ट / कॉलबैक कार्यक्षमता के साथ बातचीत करने के लिए नवीनतम गैर बहिष्कृत माध्यमों का उपयोग करता है), और उसी पावरहेल सत्र में एक ही कोड को कई बार लोड करने का प्रयास नहीं करता है:

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();

यह निम्नलिखित लेख से अनुकूलित किया गया था https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/


4
2017-08-02 19:33





मैंने ईएम 7 ओपनसोर्स आरईएसटी एपीआई पर प्रलेखन की खोज करने की कोशिश की। अब तक कोई भाग्य नहीं है।

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

ओपनसोर्स आरईएसटी एपीआई के बारे में बहुत सी बात है, लेकिन वास्तविक एपीआई या किसी भी दस्तावेज के लिए कोई लिंक नहीं है। शायद मैं अधीर था।

यहां कुछ चीजें हैं जिन्हें आप आजमा सकते हैं

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

यह देखने के लिए प्रयास करें कि क्या आप एपीआई से प्राप्त कॉलम को फ़िल्टर कर सकते हैं या नहीं

$a.Results | ft

या, आप इसका भी उपयोग कर सकते हैं

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

कर्ल स्टाइल हेडर

$b.Headers

मैंने ट्विटर जेएसओएन एपीआई के साथ आईआरएम / आईडब्ल्यूआर का परीक्षण किया।

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

उम्मीद है की यह मदद करेगा।


1
2017-08-01 03:21



आपकी सभी सहायता के लिए धन्यवाद। हालांकि पहला आदेश $ a = Invoke-RestMethod (...) वह है जो वर्तमान में मेरे लिए काम नहीं करता है। एक HTTP साइट के लिए ठीक काम करता है लेकिन जब आप HTTPS पेश करते हैं जो EM7 करता है तो यह वर्णित त्रुटि देता है। यह Invoke-RestMethod और Invoke-WebRequest के लिए है। मैं केवल एक Invoke-Command cmdlet का उपयोग करने और कर्ल चलाने की प्रक्रिया में हूं। - floyd


  1. इस आदेश को चलाएं

नया-स्व-हस्ताक्षरित प्रमाणपत्र - कर्स्टस्टोर स्थानान्तरण प्रमाणपत्र: \ localmachine \ my -dnsname {your-site-hostname}

शक्तियों का उपयोग कर व्यवस्थापक अधिकार, यह व्यक्तिगत निर्देशिका में सभी प्रमाणपत्र उत्पन्न करेगा

  1. गोपनीयता त्रुटि से छुटकारा पाने के लिए, इन प्रमाणपत्रों का चयन करें, राइट क्लिक करें → कॉपी करें। और विश्वसनीय रूट प्रमाणन प्राधिकरण / प्रमाण पत्र में पेस्ट करें।
  2. अंतिम कदम आईआईएस में सही बाइंडिंग का चयन करना है। आईआईएस वेबसाइट पर जाएं, बाइंडिंग का चयन करें, एसएनआई चेकबॉक्स का चयन करें और प्रत्येक वेबसाइट के लिए व्यक्तिगत प्रमाणपत्र सेट करें।

सुनिश्चित करें कि वेबसाइट होस्टनाम और प्रमाणपत्र डीएनएस-नाम बिल्कुल मेल खाना चाहिए


0
2018-05-26 14:37





यदि आप इसे व्यवस्थापक के रूप में चलाते हैं, तो उस त्रुटि को दूर जाना चाहिए


0
2018-06-21 17:08