Powershell Invoke-WebRequest ล้มเหลวด้วย SSL / TLS Secure Channel


253

ฉันพยายามรันคำสั่ง powershell นี้

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

และฉันได้รับข้อผิดพลาดนี้ "เรียกใช้ WebRequest: คำขอถูกยกเลิก: ไม่สามารถสร้างช่องทางที่ปลอดภัยของ SSL / TLS" คำขอ https ดูเหมือนจะทำงาน (" https://google.com ") แต่ไม่ใช่คำขอนี้ ฉันจะทำให้มันใช้งานได้หรือใช้คำสั่ง powershell อื่น ๆ เพื่ออ่านเนื้อหาของหน้าได้อย่างไร


คำตอบ:


535

ลองใช้อันนี้

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

48
โดยค่าเริ่มต้น powershell ใช้ TLS 1.0 การรักษาความปลอดภัยของไซต์ต้องใช้ TLS 1.2
Chandan Rai

3
คุณเป็นผู้กำหนดรุ่นของ TLS ได้อย่างไร
hewstone

16
ลองใช้SSLLabsเพื่อตรวจสอบข้อมูล: รายงาน SSL: apod.nasa.govแสดง TLS1.1 และ TLS1.2
Christopher G. Lewis

1
มีวิธีการทำเช่นนี้ที่ถาวรน้อยกว่าหรือไม่ ทำงานได้ แต่ดูเหมือนจะรีเซ็ตทุกหน้าต่างคอนโซล
แบรนดอน

3
@Brandon เปลี่ยนแปลงใน$env:Profileหรือดีกว่ายังตารางแก้ไขรีจิสทรี
Franklin Yu

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 ของฉันดังนั้นจึงอยู่ในทุกเซสชันที่ฉันเริ่มต้น มันไม่สามารถป้องกันความผิดพลาดได้ทั้งหมดเนื่องจากยังมีบางเว็บไซต์ที่เพิ่งล้มเหลว แต่ฉันเห็นข้อความที่สงสัยบ่อยกว่า


7
หากคุณจำเป็นต้องเข้าถึงเว็บไซต์ที่ใช้ SSLv3 [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3"แล้วคุณจะต้องการ จำไว้ว่า SSLv3 และ TLSv1.0 เลิกใช้แล้วเนื่องจาก POODLE ดังนั้นคุณต้องยอมรับความเสี่ยงเอง
jordanbtucker

ไม่มีวิธีใช้การสะท้อนเพื่อให้อนุญาต Net.SecurityProtocolType ทุกประเภทใช่หรือไม่ จะต้องมี
red888

ทำไมคุณต้องการอนุญาตการเข้าถึงโปรโตคอลที่มีข้อบกพร่องเป็นค่าเริ่มต้น โดยไม่คำนึงถึงฉันเชื่อว่าการเปิดตัว PowerShell V7 (ตามที่เขียน) ใกล้จะถึงปัญหานี้ครั้งเดียวและสำหรับทุกคนและคำถามนี้จะจางหายไปอย่างถูกต้องและสมควรได้รับการลืมเลือน
ไม่คืนเงินไม่มีผลตอบแทน

2

ถ้าอย่างฉันก็ไม่สามารถใช้งานได้ทั้งหมดข้างต้นมันอาจคุ้มค่าที่จะลองใช้รุ่น TLS ที่ต่ำกว่าโดยเฉพาะ ฉันลองทั้งสองอย่างต่อไปนี้ แต่ดูเหมือนจะไม่สามารถแก้ปัญหาของฉันได้:

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

ในท้ายที่สุดมันก็ต่อเมื่อฉันกำหนดเป้าหมาย TLS 1.0 (ลบเฉพาะ 1.1 และ 1.2 ในโค้ด) ที่ทำงาน:

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

เซิร์ฟเวอร์ภายใน (ที่พยายามทำอยู่) นั้นใช้ได้กับ TLS 1.2 แม้ว่าเซิร์ฟเวอร์ระยะไกล (ซึ่งก่อนหน้านี้ "ยืนยัน" ว่าใช้ได้สำหรับ TLS 1.2 โดยบุคคลที่สาม) ดูเหมือนจะไม่เป็นเช่นนั้น

หวังว่านี่จะช่วยใครซักคน


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 ก่อน:

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 ไฟล์ใบรับรองที่คุณต้องการใช้เพื่อส่งคำขอ
Spencer

ฉันยังไม่ชัดเจนว่ามันใช้ได้กับคำถามนี้อย่างไร
ไม่มีการคืนเงินไม่ส่งคืน

@NoRefundsNoReturns เมื่อฉันอยู่Invoke-WebRequestในพื้นที่ทำงานได้ในตอนแรก แต่จะล้มเหลวในภายหลัง ดูเหมือนว่าบางครั้งมันไม่สามารถอ่านหนังสือรับรองได้อีกต่อไป (ฉันไม่ทราบกลไกที่อยู่เบื้องหลังมันอาจเป็นการตั้งค่าที่ควบคุมโดย บริษัท ) แต่การติดตั้งใบรับรองจะทำงานในกรณีนี้
Spencer

หากคุณสูญเสียรหัสส่วนตัวสำหรับใบรับรองที่สามารถทำให้ใบรับรองใช้ไม่ได้อย่างแน่นอน แต่ฉันสงสัยว่าเป็นปัญหาที่นี่ หากคุณทำคีย์หายคุณต้องตรวจสอบให้แน่ใจว่าคุณได้บันทึกคีย์ส่วนตัวและทำเครื่องหมายถาวร ถามคำถามใหม่ว่านี่คือสิ่งที่เกิดขึ้น
ไม่มีการคืนเงินไม่มีผลตอบแทน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.