Powershell Invoke-WebRequest Thất bại với Kênh bảo mật SSL / TLS


254

Tôi đang cố gắng thực hiện lệnh powershell này

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

và tôi nhận được lỗi này. "Invoke-WebRequest: Yêu cầu đã bị hủy: Không thể tạo kênh bảo mật SSL / TLS." Các yêu cầu https dường như hoạt động (" https://google.com ") nhưng không phải là yêu cầu này. Làm thế nào tôi có thể làm điều này để làm việc hoặc sử dụng lệnh powershell khác để đọc nội dung trang?


Câu trả lời:


537

thử dùng cái này

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

48
Theo mặc định, powershell sử dụng TLS 1.0, bảo mật trang web yêu cầu TLS 1.2
Chandan Rai

3
Awh, Làm thế nào bạn xác định phiên bản TLS của trang web?
hewstone

16
Hãy thử SSLLabs để xác định thông tin: Báo cáo SSL: apod.nasa.gov hiển thị TLS1.1 và TLS1.2
Christopher G. Lewis

1
Có cách nào để làm điều này lâu hơn một chút không? Điều này hoạt động nhưng dường như để thiết lập lại với mọi cửa sổ giao diện điều khiển.
Brandon

3
@Brandon Thay đổi nó trong $env:Profile, hoặc tốt hơn nữa, chỉnh sửa bảng đăng ký .
Franklin Yu

166

Trong một nỗ lực không biết xấu hổ để ăn cắp một số phiếu, SecurityProtocollà một Enumvới [Flags]thuộc tính. Vì vậy, bạn có thể làm điều này:

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

Hoặc vì đây là PowerShell, bạn có thể để nó phân tích một chuỗi cho bạn:

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

Sau đó, bạn không cần phải biết phiên bản TLS.

Tôi đã sao chép và dán đoạn mã này từ một tập lệnh mà tôi đã tạo sau khi đọc câu trả lời này vì tôi không muốn chuyển qua tất cả các giao thức có sẵn để tìm một giao thức hoạt động. Tất nhiên rồi có thể làm điều đó nếu bạn muốn.

Lưu ý cuối cùng - Tôi có câu lệnh gốc (trừ các chỉnh sửa SO) trong hồ sơ PowerShell của mình để nó có trong mọi phiên tôi bắt đầu ngay bây giờ. Nó không hoàn toàn dễ hiểu vì vẫn còn một số trang web bị lỗi nhưng tôi chắc chắn thấy thông báo được đề cập ít thường xuyên hơn.


7
Nếu bạn cần truy cập một trang web sử dụng SSLv3, thì bạn sẽ muốn [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". Hãy nhớ rằng SSLv3 và TLSv1.0 đã bị phản đối do POODLE, vì vậy hãy tự chịu rủi ro khi sử dụng.
jordanbtucker

không có cách nào để sử dụng sự phản chiếu để chỉ cho phép tất cả các loại Net.SecurityProtocolType? phải có
red888

Tại sao bạn muốn cho phép truy cập các giao thức thiếu sót theo mặc định? Bất kể, tôi tin rằng bản phát hành sắp tới (kể từ bài viết này) của PowerShell V7 sẽ giải quyết vấn đề này một lần và mãi mãi và câu hỏi này sẽ dần dần biến thành sự lãng quên đúng đắn và có lợi của nó.
Không hoàn lại tiền Không trả lại

2

Nếu, giống như tôi, không có cách nào ở trên hoạt động hoàn toàn, có lẽ cũng đáng để thử một phiên bản TLS thấp hơn. Tôi đã thử cả hai cách sau, nhưng dường như không giải quyết được vấn đề của tôi:

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

Cuối cùng, chỉ khi tôi nhắm mục tiêu TLS 1.0 (cụ thể loại bỏ 1.1 và 1.2 trong mã) thì nó mới hoạt động:

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

Máy chủ cục bộ (điều này đã được thử) vẫn ổn với TLS 1.2, mặc dù máy chủ từ xa (trước đây đã được "xác nhận" là tốt đối với TLS 1.2 bởi bên thứ 3) dường như không phải vậy.

Hy vọng điều này sẽ giúp được ai đó.


1

Nó hoạt động với tôi ...

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
Câu trả lời này vô hiệu hóa kiểm tra an ninh. Mặc dù nó có thể loại bỏ lỗi nhưng nó mở bề mặt tấn công thiết bị của bạn theo những cách mà nhiều người cho là không thể chấp nhận được. Tôi sẽ không bao giờ sử dụng điều này trên một thiết bị mà tôi sở hữu.
Không hoàn lại tiền Không trả lại

1

Hãy chắc chắn rằng bạn chuyển SHELL trước:

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

Tôi không biết lý do nhưng cài đặt lại .pfxchứng chỉ (cả người dùng hiện tại và máy cục bộ) đều hoạt động với tôi.


Bạn đã cài đặt lại .pfx nào?
Không hoàn lại tiền Không trả lại

@NoRefundsNoReturns Tệp chứng chỉ mà bạn muốn sử dụng để gửi yêu cầu.
Spencer

Tôi vẫn chưa rõ làm thế nào điều này có thể áp dụng cho câu hỏi.
Không hoàn lại tiền Không trả lại

@NoRefundsNoReturns Khi tôi Invoke-WebRequestở địa phương, nó hoạt động lúc đầu nhưng sẽ thất bại sau. Có vẻ như đôi khi nó không thể đọc chứng chỉ nữa (tôi không biết cơ chế đằng sau nó. Có lẽ đó là một thiết lập được kiểm soát bởi công ty). Nhưng cài đặt lại các chứng chỉ hoạt động trong trường hợp này.
Spencer

Nếu bạn đang mất khóa riêng cho một chứng chỉ chắc chắn có thể khiến chứng chỉ không thể sử dụng được nhưng tôi nghi ngờ đó là vấn đề ở đây. Nếu bạn đang mất khóa, thì bạn cần chắc chắn rằng bạn đang lưu khóa riêng và đánh dấu nó liên tục. Đặt một câu hỏi mới nếu đây là những gì đang xảy ra.
Không hoàn lại tiền Không trả lại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.