SSL / TLS 보안 채널로 Powershell Invoke-WebRequest 실패


253

이 powershell 명령을 실행하려고합니다.

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

이 오류가 발생합니다. "Invoke-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
좀 더 영구적 인 방법이 있습니까? 이것은 작동하지만 모든 콘솔 창에서 재설정되는 것처럼 보입니다.
Brandon

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 프로필에 원본 (마이너스 SO 편집) 문이 있으므로 지금 시작하는 모든 세션에 있습니다. 여전히 실패한 사이트가 있기 때문에 완전히 바보는 아니지만 확실하게 문제의 메시지를 훨씬 덜 보게됩니다.


7
SSLv3을 사용하는 사이트에 액세스해야하는 경우을 원할 것 [Net.ServicePointManager]::SecurityProtocol = "Tls12, Tls11, Tls, Ssl3"입니다. POODLE로 인해 SSLv3 및 TLSv1.0은 더 이상 사용되지 않으므로 위험 부담으로 사용하십시오.
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

원격 서버 (이전에 제 3자가 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 요청을 보내는 데 사용할 인증서 파일입니다.
스펜서

이것이 이것이 어떻게 질문에 적용되는지 명확하지 않습니다.
환불 불가 환불 불가

@NoRefundsNoReturns Invoke-WebRequest로컬에서 처음에는 작동하지만 나중에 실패합니다. 때로는 더 이상 인증서를 읽을 수없는 것 같습니다 (배후의 메커니즘을 모르겠습니다. 어쩌면 회사가 제어하는 ​​설정 일 수도 있습니다). 그러나이 경우 인증서를 다시 설치하면됩니다.
스펜서

인증서를 사용할 수 없게 만들 수있는 인증서의 개인 키를 잃어 버린 경우 여기서 문제가 의심됩니다. 키를 잃어버린 경우 개인 키를 저장하고 영구적으로 표시해야합니다. 이것이 일어나고 있는지 새로운 질문을하십시오.
환불 불가 환불 불가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.