Powershell Invoke-WebRequest SSL / TLS Güvenli Kanalı ile Başarısız


255

Bu powershell komutunu çalıştırmaya çalışıyorum

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

ve bu hatayı alıyorum. "Invoke-WebRequest: İstek iptal edildi: SSL / TLS güvenli kanalı oluşturulamadı." https istekleri işe yarıyor (" https://google.com "), ancak söz konusu istekte bulunulmuyor . Sayfa içeriğini okumak için bunu nasıl çalıştırabilirim veya diğer powershell komutunu kullanabilirim?


Yanıtlar:


538

bunu kullanmayı dene

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

48
Varsayılan olarak powershell TLS 1.0 kullanır, site güvenliği TLS 1.2 gerektirir
Chandan Rai

3
Aaa, Sitenin TLS sürümünü nasıl belirlediniz?
hewstone

16
Bilgileri belirlemek için SSLLabs'ı deneyin : SSL Raporu: apod.nasa.gov , TLS1.1 ve TLS1.2'yi gösteriyor
Christopher G. Lewis

1
Bunu yapmanın biraz daha kalıcı bir yolu var mı? Bu çalışıyor, ancak her konsol penceresi ile sıfırlanmış gibi görünüyor.
Brandon

3
@Brandon Kayıt defteri tablosunu değiştirin$env:Profile veya daha iyisi değiştirin .
Franklin Yu

166

Bazı oy çalmaya utanmaz girişimde, SecurityProtocolbir olduğunu Enumile [Flags]öznitelik. Böylece bunu yapabilirsiniz:

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

Veya bu PowerShell olduğundan, sizin için bir dizeyi ayrıştırmasına izin verebilirsiniz:

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

O zaman teknik olarak TLS sürümünü bilmenize gerek yoktur.

Bu cevabı okuduktan sonra oluşturduğum bir senaryodan kopyaladım ve yapıştırdım çünkü işe yarayan birini bulmak için tüm mevcut protokoller arasında dolaşmak istemedim. Tabii ki, olabilir eğer istersen öyle yap.

Son not - PowerShell profilimde orijinal (eksi SO düzenlemeleri) ifadesi var, bu yüzden şimdi başladığım her oturumda. Tamamen kusursuz değildir, çünkü hala başarısız olan bazı siteler vardır, ancak söz konusu mesajı çok daha az sıklıkta görüyorum.


7
SSLv3 kullanan bir siteye erişmeniz gerekiyorsa, istersiniz [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3". SSLv3 ve TLSv1.0'ın POODLE nedeniyle kullanımdan kaldırıldığını unutmayın, bu nedenle kendi sorumluluğunuzdadır.
jordanbtucker

sadece tüm Net.SecurityProtocolType türlerine izin vermek için yansıma kullanmanın bir yolu yok mu? orada olması gereken
red888

Bilinen kusurlu protokollerin neden varsayılan olarak erişmesine izin vermek istiyorsunuz? Ne olursa olsun, PowerShell V7'nin yakında çıkacak olan (bu yazı itibariyle) bu sorunu bir kez ve herkes için ele alacağına inanıyorum ve bu soru yavaşça haklı ve iyi kazanılmış unutulmaya dönüşecek.
Para İadesi Yok İade Yok

2

Benim gibi, yukarıdakilerin hiçbiri işe yaramazsa, özellikle daha düşük bir TLS sürümünü denemeye değer olabilir. Aşağıdakilerin ikisini de denemiştim, ancak sorunumu çözmedim:

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

Sonunda, sadece TLS 1.0 (özellikle koddaki 1.1 ve 1.2'yi kaldır) hedeflediğinde işe yaradı:

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

Yerel sunucu (bu deneniyordu) TLS 1.2 ile gayet iyi, ancak uzak sunucu (daha önce "bir üçüncü taraf tarafından TLS 1.2 için iyi" olarak onaylandı ") görünmüyor.

Umarım bu birine yardımcı olur.


1

Benim için çalışıyor ...

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
Bu yanıt, güvenlik denetimini etkin bir şekilde devre dışı bırakır. Hatayı ortadan kaldırsa da, cihazınızın saldırı yüzeyini birçok kişinin kabul edilemez olarak göreceği şekilde açar. Bunu asla sahip olduğum bir cihazda kullanmam.
İadesi Yok İade Yok

1

Önce SHELL'i değiştirdiğinizden emin olun:

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

Nedeni bulamadım ancak .pfxsertifikayı (hem mevcut kullanıcıda hem de yerel makinede) yeniden yüklemek benim için çalışıyor.


Hangi .pfx dosyasını yeniden yüklediniz?
İadesi Yok İade Yok

@NoRefundsNoReturns İsteği göndermek için kullanmak istediğiniz sertifika dosyası.
Spencer

Bunun soruya nasıl uygulanabileceğinden hala emin değilim.
İade Yok İade Yok

@NoRefundsNoReturns Ben Invoke-WebRequestyerel olarak, ilk başta çalışır ama daha sonra başarısız olur. Bazen sertifikayı artık okuyamıyor gibi görünüyor (arkasındaki mekanizmayı bilmiyorum. Belki şirket tarafından kontrol edilen bir ayardır). Ancak bu durumda sertifikayı yeniden yüklemek işe yarar.
Spencer

Sertifikayı kesinlikle kullanılamaz hale getirebilecek bir sertifika için özel anahtarı kaybediyorsanız, burada sorun olduğundan şüpheliyim. Anahtarı kaybediyorsanız, özel anahtarı kaydettiğinizden ve kalıcı olarak işaretlediğinizden emin olmanız gerekir. Bunun olup olmadığını yeni bir soru sorun.
İadesi Yok İade Yok
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.