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.