Powershell v3 Invoke-WebRequest HTTPS त्रुटि


126

Powershell v3 के इनवोक-वेबरेंस और इनवोक-रेस्टमैथोड का उपयोग करके मैंने एक https वेबसाइट पर एक json फ़ाइल पोस्ट करने के लिए सफलतापूर्वक 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

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

 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}

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

धन्यवाद


तो आप कौन सा उपयोग कर रहे हैं? Invoke-RestMethodया Invoke-WebRequest?
ज़िक

आह्वान-WebRequest। मैं इसका उपयोग करता हूं क्योंकि यह Invoke-RestMethod के विपरीत अनुरोध / रिस्पॉन्स हेडर देता है। हालाँकि मैंने इन्वोक-रेस्टमेथोड की कोशिश की है जो समान मापदंडों को भी लेता है।
जूल

इसके लायक क्या है, ServerValidationCallback चीज लगभग निश्चित रूप से एक लाल हेरिंग है, क्योंकि जब आपको SSL सत्यापन की समस्या होती है, तो त्रुटि आपको मिलनी चाहिए SAY कि: Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. आप अधिक जानकारी के लिए $ त्रुटि [0] .Exception.nerException की खोज करने का प्रयास कर सकते हैं .. ।
जयकुल

जवाबों:


179

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

मूल रूप से, आपके PowerShell स्क्रिप्ट में:

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"

9
ध्यान दें, यह उत्तर सही है; हालाँकि, एक अन्य उत्तर ( stackoverflow.com/a/25163476/68432 ) पर बना बिंदु भी मान्य है। यदि आपने "[System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true}" पहले से किया है तो यह समाधान काम नहीं करेगा।
पॉल सुर्ट

आपको नीचे दिए गए आर्थर स्ट्रटजेनबर्ग उत्तर के अनुसार टाइप स्थिति जांच को जोड़ने की आवश्यकता है या आपको यह कहते हुए एक त्रुटि मिलेगी कि टाइप पहले से मौजूद है
राल्फ विलगॉस

क्या उत्पादन में इसका उपयोग करने के लिए सुरक्षा जोखिम है?
अमजद

13
5 साल बाद, यह अभी भी PowerShell 5.1 (पूर्ण .NET फ्रेमवर्क) के लिए समाधान है। PowerShell Core के लिए -SkipCertificateCheckअभी है।
बुराईनोबू

MS ने Connect ले लिया है, वह लिंक अमान्य है। क्या कोई और कड़ी है?
मार्क हीथ

71

ली का जवाब बहुत अच्छा है, लेकिन मेरे पास ऐसे मुद्दे भी थे जिनके साथ वेब सर्वर समर्थित हैं।
निम्नलिखित पंक्तियों को जोड़ने के बाद, मैं 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

क्या आपको बेहतर समाधान मिला है, coz यदि आपके पास 40 स्क्रिप्ट हैं तो आपको इसे प्रत्येक में जोड़ना होगा। कोई मतलब नहीं है लगता है। Btw, उत्तर के लिए धन्यवाद
एंडर

1
ली का जवाब मेरे काम नहीं आया। मुझे आपके द्वारा संदर्भित बिट्स को जोड़ना था और इसे काम करना था!
पाट K

बहुत बहुत धन्यवाद, प्रोटोकॉल को निर्दिष्ट करने से समस्या को हल करने में मदद मिली
एलेक्स

1
धन्यवाद, आपने मुझे SecurityProtocolवैश्विक स्थिर संपत्ति दिखाने के लिए धन्यवाद दिया । मसीह, मैंने प्रमाण पत्र, ट्रस्ट, नेटवर्क, मार्ग, अनुमति, और अन्य चीजों की shitload की जाँच करने पर केवल DAYS खो दिया है, endpoint does not respondजब एक विशिष्ट सर्वर को https (सभी अन्य काम करते हैं) तक पहुँचने में अस्पष्ट त्रुटि को हल करने की कोशिश की जा रही है , सिर्फ इसलिए कि देवता शक्तियों 5.1 SSL3, टीएलएस को चूक और यह सिर्फ ब्लाकों धत् तेरे की TLS11 और TLS12 द्वारा चूक भगवान कितना मैं इस बकवास से नफरत है मैं लिखा जाना चाहिए था कि सी # / रूबी / C ++, या जो कुछ भी में स्क्रिप्ट powershell नहीं है
Quetzalcoatl

1
@StanTastic: मुझे लगता है कि चूक को स्थायी रूप से बदलना असंभव है। मुझे लगता है कि यह ServicePointManager स्रोत कोड में हार्डकोड है। मैंने हालांकि कभी चेक नहीं किया, इसलिए शायद कोई रास्ता है।
quetzalcoatl 14

10

क्या आपने प्रयोग करने की कोशिश की 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)

सनी, मुझे उस कोड का उपयोग करते समय निम्नलिखित प्राप्त होता है: अपवाद "1" तर्क के साथ "डाउनलोडस्ट्रीमिंग" को कॉल करना: "दूरस्थ सर्वर ने एक त्रुटि लौटा दी: (406) स्वीकार्य नहीं।" लाइन में: 4 char: 1 + $ wc.DownloadString ($ url) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ श्रेणी: ], MethodInvocationException + FullQualifiedErrorId: WebException
Floyd

बाकी सेवा im 406 का उपयोग करने का API दस्तावेज़ों के आधार पर इंगित करता है "कि स्वीकार हैडर अनुरोध एक XML या JSON प्रतिक्रिया की अनुमति नहीं है में शामिल"
फ्लोयड

यदि XML / JSON प्रतिक्रियाओं की अनुमति नहीं है तो क्या प्रतिक्रिया प्रकार की अनुमति है?
सनी चक्रवर्ती

क्या यह एक कस्टम वेब सेवा है जिसका आप उपयोग कर रहे हैं? क्या REST API के लिए कोई सार्वजनिक रूप से उपलब्ध दस्तावेज है?
सनी चक्रवर्ती

यह एक टिकट प्रणाली है जिसे EM7 कहा जाता है, मुझे विश्वास नहीं है कि उनके पास सार्वजनिक डॉक्स हैं। सेवा JSON / XML प्रतिक्रिया को स्वीकार करती है (अगर मैं cURL का उपयोग करता हूं तो ठीक काम करता है) मेरा मानना ​​है कि त्रुटि यह संकेत दे रही है कि System.Net.WebClient isnt?
जूल

9

शुद्ध में एक वैकल्पिक कार्यान्वयन (बिना Add-Typeके स्रोत):

#requires -Version 5
#requires -PSEdition Desktop

class TrustAllCertsPolicy : System.Net.ICertificatePolicy {
    [bool] CheckValidationResult([System.Net.ServicePoint] $a,
                                 [System.Security.Cryptography.X509Certificates.X509Certificate] $b,
                                 [System.Net.WebRequest] $c,
                                 [int] $d) {
        return $true
    }
}
[System.Net.ServicePointManager]::CertificatePolicy = [TrustAllCertsPolicy]::new()

7

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

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-use-powershell/ से अनुकूलित किया गया था


5

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

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

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

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
}


1

मैंने EM7 OpenSource REST API पर प्रलेखन खोजने की कोशिश की। अब तक कोई भाग्य नहीं।

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

OpenSource REST API के बारे में बहुत सी बातें हैं, लेकिन वास्तविक API या किसी भी दस्तावेज़ के लिए कोई लिंक नहीं है। शायद मैं अधीर था।

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

$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

मैंने ट्विटर JSON एपी के साथ IRM / IWR का परीक्षण किया।

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

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


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

1

इनवोक-वेबरेस्ट "डोमेननाम" -SipipertificateCheck

आप इसे एक-लाइनर कमांड के रूप में प्राप्त करने के लिए -SkipCertificateCheck पैरामीटर का उपयोग कर सकते हैं (यह समसामयिक स्थिति पर केवल समर्थित है)


0
  1. यह आदेश चलाएँ

नया-स्वनिर्धारित सर्टिफ़िकेट-सर्टिस्टोरेशन सर्टिफ़िकेट: \ localmachine \ my -dnsname {आपका साइट-होस्टनाम}}

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

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

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


0

ये रजिस्ट्री सेटिंग्स .NET फ्रेमवर्क 4+ को प्रभावित करती हैं और इसलिए PowerShell। उन्हें सेट करें और नवीनतम TLS का उपयोग करने के लिए किसी भी PowerShell सत्र को पुनरारंभ करें, कोई रिबूट की आवश्यकता नहीं है।

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 

Https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#schusestrongcrypto देखें


इस उत्तर को देखने वाले किसी अन्य व्यक्ति के लिए, हमारा अनुभव यह है कि यह रजिस्ट्री पैच, वास्तव में, उचित कार्यक्षमता की गारंटी के लिए रिबूट की आवश्यकता है। .NET ऐप चलाने वाले विंडोज बॉक्स के बीच TLS 1.2 कनेक्शन सुनिश्चित करने का प्रयास करते समय, SSL 3 को नेटवर्क ट्रेस के माध्यम से इस रजिस्ट्री मान के साथ उपयोग करने के लिए दिखाया गया था, लेकिन रिबूट से पहले; टीएलएस 1.2 को रिबूट के बाद ही लागू किया गया था।
डेविड डब्ल्यू

-1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.