Gagal Powershell Invoke-WebRequest dengan Saluran Aman SSL / TLS

254

Saya mencoba menjalankan perintah PowerShell ini

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

dan saya mendapatkan kesalahan ini. "Invoke-WebRequest: Permintaan dibatalkan: Tidak dapat membuat saluran aman SSL / TLS." Permintaan https tampaknya berfungsi (" https://google.com ") tetapi bukan yang ini. Bagaimana saya bisa membuatnya bekerja atau menggunakan perintah powershell lain untuk membaca konten halaman?

Hewstone
sumber
2
Lihat juga Default SecurityProtocol di .NET 4.5 .
Franklin Yu

Jawaban:

537

coba gunakan yang ini

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
Chandan Rai
sumber
48
Secara default powershell menggunakan TLS 1.0 keamanan situs memerlukan TLS 1.2
Chandan Rai
3
Awh, Bagaimana Anda menentukan versi situs TLS?
hewstone
16
Coba SSLLabs untuk menentukan informasi: Laporan SSL: apod.nasa.gov menunjukkan TLS1.1 dan TLS1.2
Christopher G. Lewis
1
Apakah ada cara untuk melakukan ini yang sedikit lebih permanen? Ini berfungsi tetapi tampaknya direset dengan setiap jendela konsol.
Brandon
3
@Brandon Ubah $env:Profile, atau lebih baik lagi, edit tabel registri .
Franklin Yu
166

Dalam upaya yang tak tahu malu untuk mencuri suara, SecurityProtocoladalah Enumdengan [Flags]atribut. Jadi Anda bisa melakukan ini:

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

Atau karena ini adalah PowerShell, Anda dapat membiarkannya mengurai string untuk Anda:

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

Maka Anda secara teknis tidak perlu tahu versi TLS.

Saya menyalin dan menempelkan ini dari skrip yang saya buat setelah membaca jawaban ini karena saya tidak ingin menelusuri semua protokol yang tersedia untuk menemukan yang berfungsi. Tentu saja, Anda bisa melakukannya jika Anda mau.

Catatan akhir - Saya memiliki pernyataan asli (dikurangi pengeditan SO) di profil PowerShell saya sehingga dalam setiap sesi saya mulai sekarang. Ini tidak sepenuhnya aman karena masih ada beberapa situs yang gagal tetapi saya pasti melihat pesan tersebut lebih jarang.

Tanpa Pengembalian Uang Tanpa Pengembalian
sumber
7
Jika Anda perlu mengakses situs yang menggunakan SSLv3, maka Anda akan menginginkannya [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". Ingatlah bahwa SSLv3 dan TLSv1.0 telah ditinggalkan karena POODLE, jadi gunakan dengan risiko Anda sendiri.
jordanbtucker
bukankah ada cara untuk menggunakan refleksi untuk mengizinkan semua jenis Net.SecurityProtocolType? harus ada
red888
Mengapa Anda ingin mengizinkan akses protokol yang dikenal cacat secara default? Terlepas dari itu, saya percaya rilis PowerShell V7 yang segera (pada saat penulisan ini) akan membahas masalah ini sekali dan untuk semua dan pertanyaan ini perlahan-lahan akan memudar menjadi terlupakan yang sah dan diperoleh dengan baik.
Tanpa Pengembalian Uang Tanpa Pengembalian
2

Jika, seperti saya, tidak satu pun di atas cukup berfungsi, mungkin layak juga secara khusus mencoba versi TLS yang lebih rendah saja. Saya telah mencoba kedua hal berikut, tetapi sepertinya tidak menyelesaikan masalah saya:

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

Pada akhirnya, hanya ketika saya menargetkan TLS 1.0 (khusus menghapus 1,1 dan 1,2 dalam kode) itu berhasil:

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

Server lokal (bahwa ini sedang dicoba) baik-baik saja dengan TLS 1.2, meskipun server jauh (yang sebelumnya "dikonfirmasi" sebagai baik untuk TLS 1.2 oleh pihak ke-3) tampaknya tidak.

Semoga ini bisa membantu seseorang.

Markus-DG1
sumber
1

Ini bekerja untuk saya ...

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/
Gowtham Balusamy
sumber
1
Jawaban ini secara efektif menonaktifkan pemeriksaan keamanan. Meskipun mungkin menghilangkan kesalahan itu membuka permukaan serangan perangkat Anda dengan cara yang banyak orang akan menganggap tidak dapat diterima. Saya tidak akan pernah menggunakan ini pada perangkat yang saya miliki.
Tanpa Pengembalian Uang Tanpa Pengembalian
1

Pastikan Anda mengganti SHELL terlebih dahulu:

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'
pixelbits
sumber
0

Saya belum mengetahui alasannya tetapi menginstal ulang .pfxsertifikat (baik di pengguna saat ini dan mesin lokal) bekerja untuk saya.

Spencer
sumber
.pfx mana yang Anda instal ulang?
Tanpa Pengembalian Uang Tanpa Pengembalian
@NoRefundsNoReturns File sertifikat yang ingin Anda gunakan untuk mengirim permintaan.
Spencer
Saya masih tidak jelas bagaimana ini berlaku untuk pertanyaan.
Tanpa Pengembalian Uang Tanpa Pengembalian
@NoRefundsNoReturns Ketika saya Invoke-WebRequestsecara lokal, ia bekerja pada awalnya tetapi akan gagal nanti. Sepertinya kadang-kadang tidak bisa membaca sertifikat lagi (saya tidak tahu mekanisme di baliknya. Mungkin itu pengaturan yang dikendalikan oleh perusahaan). Tetapi menginstal ulang sertifikat berfungsi dalam kasus ini.
Spencer
Jika Anda kehilangan kunci pribadi untuk sertifikat yang tentu saja dapat membuat sertifikat tidak dapat digunakan, tetapi saya ragu itu masalahnya di sini. Jika Anda kehilangan kunci, maka Anda perlu memastikan bahwa Anda menyimpan kunci pribadi dan menandainya terus-menerus. Ajukan pertanyaan baru jika ini yang terjadi.
Tanpa Pengembalian Uang Tanpa Pengembalian