एसएसएल / टीएलएस सिक्योर चैनल के साथ पॉवर्सशेल इनवोक-वेबरेस्टेस्ट फेल


253

मैं इस पॉवरशेल कमांड को निष्पादित करने की कोशिश कर रहा हूं

Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

और मुझे यह त्रुटि मिलती है। "इनवोक-वेबरेस्ट: अनुरोध निरस्त कर दिया गया: एसएसएल / टीएलएस सुरक्षित चैनल नहीं बना सका।" https अनुरोध काम करने के लिए दिखाई देते हैं (" https://google.com ") लेकिन यह प्रश्न में नहीं है। पेज की सामग्री को पढ़ने के लिए मैं इसे कैसे प्राप्त कर सकता हूं या अन्य शक्तियां कमांड का उपयोग कर सकता हूं?


जवाबों:


535

यह प्रयोग करके देखें

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

48
डिफ़ॉल्ट रूप से शब्‍दानुसार टीएलएस 1.0 का उपयोग करता है। साइट सुरक्षा के लिए टीएलएस 1.2
चंदन राय

3
Awh, आपने साइट का TLS संस्करण कैसे निर्धारित किया?
हेवस्टोन

16
जानकारी निर्धारित करने के लिए SSLLabs की कोशिश करें : SSL रिपोर्ट: apod.nasa.gov TLS1.1 और TLS1.2 को दिखाता है
क्रिस्टोफर जी। लुईस

1
क्या ऐसा करने का कोई तरीका है जो थोड़ा और स्थायी हो? यह काम करता है लेकिन हर कंसोल विंडो के साथ रीसेट होने लगता है।
ब्रैंडन

3
@Brandon इसे बदलें $env:Profile, या बेहतर अभी तक, रजिस्ट्री तालिका संपादित करें
फ्रेंकलिन यू

166

कुछ वोट चुराने की बेशर्म कोशिश में, SecurityProtocolएक विशेषता के Enumसाथ है [Flags]। तो आप यह कर सकते हैं:

[Net.ServicePointManager]::SecurityProtocol = 
  [Net.SecurityProtocolType]::Tls12 -bor `
  [Net.SecurityProtocolType]::Tls11 -bor `
  [Net.SecurityProtocolType]::Tls

या जब से यह PowerShell है, आप इसे आपके लिए एक स्ट्रिंग पार्स कर सकते हैं:

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"

तब आपको TLS संस्करण को तकनीकी रूप से जानने की आवश्यकता नहीं है।

मैंने इस उत्तर को पढ़ने के बाद बनाई गई स्क्रिप्ट से कॉपी और पेस्ट किया क्योंकि मैं काम करने के लिए सभी उपलब्ध प्रोटोकॉल के माध्यम से चक्र नहीं करना चाहता था। बेशक, आप कर सकते थे ऐसा हैं यदि आप चाहते थे।

अंतिम नोट - मेरे पास मेरे PowerShell प्रोफ़ाइल में मूल (माइनस SO संपादन) स्टेटमेंट है इसलिए यह हर सत्र में है जो मैं अब शुरू करता हूं। यह पूरी तरह से मूर्खतापूर्ण नहीं है क्योंकि अभी भी कुछ साइटें हैं जो अभी विफल हैं लेकिन मैं निश्चित रूप से संदेश को बहुत कम बार देखता हूं।


7
यदि आपको SSLv3 का उपयोग करने वाली साइट तक पहुंचने की आवश्यकता है, तो आप चाहते हैं [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3"। याद रखें कि SSLv3 और TLSv1.0 POODLE के कारण हटाए गए हैं, इसलिए अपने जोखिम पर उपयोग करें।
जोर्डनबुटकर

वहाँ सभी Net.SecurityProtocolType प्रकारों की अनुमति देने के लिए प्रतिबिंब का उपयोग करने का एक तरीका नहीं है? वहाँ होना चाहिए
red888

आप ज्ञात-त्रुटिपूर्ण प्रोटोकॉल को डिफ़ॉल्ट रूप से एक्सेस करने की अनुमति क्यों देना चाहते हैं? बावजूद, मेरा मानना ​​है कि PowerShell V7 के आसन्न (इस लेखन के रूप में) इस मुद्दे को एक बार और सभी के लिए संबोधित करेंगे और यह सवाल धीरे-धीरे अपने सही और अच्छी तरह से अर्जित विस्मरण में फीका हो जाएगा।
कोई रिफंड नहीं

2

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

[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls

अंत में, यह केवल तब था जब मैंने टीएलएस 1.0 को लक्षित किया था (विशेषकर 1.1 और 1.2 को कोड में हटा दें) जो काम करता था:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls

स्थानीय सर्वर (जिस पर यह प्रयास किया जा रहा था) टीएलएस 1.2 के साथ ठीक है, हालांकि रिमोट सर्वर (जो कि पहले से पुष्टि की गई थी) टीएलएस 1.2 के लिए 3 जी पार्टी द्वारा ठीक नहीं है।

आशा है कि यह किसी की मदद करता है।


1

इससे मेरा काम बनता है...

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

Invoke-WebRequest -Uri https://apod.nasa.gov/apod/

1
यह उत्तर सुरक्षा जाँच को प्रभावी ढंग से अक्षम करता है। हालांकि यह त्रुटि को समाप्त कर सकता है यह आपके डिवाइस की सतह को उन तरीकों से खोलता है जो बहुत से अस्वीकार्य होंगे। मैं इसका उपयोग कभी ऐसे उपकरण पर नहीं करूंगा जो मेरा अपना है।
कोई रिफंड नहीं रिटर्न

1

सुनिश्चित करें कि आप पहले शेल स्विच करें:

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
RUN Invoke-WebRequest -UseBasicParsing -Uri  'https://github.com/git-for-windows/git/releases/download/v2.25.1.windows.1/Git-2.25.1-64-bit.exe' -OutFile 'outfile.exe'

0

मैंने कारण का पता नहीं लगाया है, लेकिन मेरे लिए .pfxसर्टिफिकेट (वर्तमान उपयोगकर्ता और स्थानीय मशीन दोनों में) को पुनः स्थापित करना।


जो .pfx आपने पुन: स्थापित किया?
नो रिफंड्स नो रिटर्न

@NoRefundsNoReturns प्रमाणपत्र फ़ाइल जिसे आप अनुरोध भेजने के लिए उपयोग करना चाहते हैं।
स्पेंसर

मैं अभी भी स्पष्ट नहीं हूं कि यह प्रश्न पर कैसे लागू होता है।
नो रिवाइंड्स नो रिटर्न

@NoRefundsNoReturns जब मैं Invoke-WebRequestस्थानीय रूप से काम करता हूं , तो यह पहले काम करता है लेकिन बाद में विफल हो जाएगा। ऐसा लगता है कि कभी-कभी यह प्रमाणपत्र को और अधिक नहीं पढ़ सकता है (मुझे इसके पीछे के तंत्र का पता नहीं है। शायद यह कंपनी द्वारा नियंत्रित एक सेटिंग है)। लेकिन इस मामले में प्रमाणित कार्यों को फिर से स्थापित करना।
स्पेंसर

यदि आप किसी प्रमाणपत्र के लिए निजी कुंजी खो रहे हैं जो निश्चित रूप से प्रमाणपत्र को अनुपयोगी बना सकता है लेकिन मुझे संदेह है कि यहां समस्या है। यदि आप कुंजी खो रहे हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि आप निजी कुंजी को सहेज रहे हैं और इसे लगातार चिह्नित कर रहे हैं। एक नया प्रश्न पूछें कि क्या ऐसा हो रहा है।
नो रिफंड्स नो रिटर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.