it-swarm-ko.tech

Powershell v3 Invoke-WebRequest HTTPS 오류

Powershell v3의 Invoke-WebRequest 및 Invoke-RestMethod를 사용하여 json 파일을 https 웹 사이트에 게시하기 위해 POST 메소드를 성공적으로 사용했습니다.

내가 사용하는 명령은

 $cert=New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("cert.crt")
 Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert -Body $json -ContentType application/json -Method POST

그러나 GET 방법을 사용하려고하면 다음과 같습니다.

 Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert -Method GET

다음과 같은 오류가 반환됩니다

 Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send.
 At line:8 char:11
 + $output = Invoke-RestMethod -Uri https://IPADDRESS/resource -Credential $cred
 +           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest)      [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

SSL 인증서를 무시하기 위해 다음 코드를 사용하려고 시도했지만 실제로 어떤 작업을 수행하는지 잘 모르겠습니다.

 [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

누군가 여기서 잘못 될 수있는 문제와 해결 방법에 대한 지침을 제공 할 수 있습니까?

감사

109
floyd

이 해결 방법은 나를 위해 일했습니다 : http://connect.Microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

기본적으로 PowerShell 스크립트에서 :

add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$result = Invoke-WebRequest -Uri "https://IpAddress/resource"
152
Lee Grissom

Lee의 답변은 훌륭하지만 웹 서버가 지원하는 프로토콜에 문제가 있습니다.
다음 줄도 추가 한 후 https 요청을받을 수 있습니다. 이 답변에서 지적했듯이 https://stackoverflow.com/a/36266735

$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols

Lee의 코드가있는 내 전체 솔루션.

add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
    public bool CheckValidationResult(
        ServicePoint srvPoint, X509Certificate certificate,
        WebRequest request, int certificateProblem) {
        return true;
    }
}
"@
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
60
AndOs

System.Net.WebClient을 사용해 보셨습니까?

$url = 'https://IPADDRESS/resource'
$wc = New-Object System.Net.WebClient
$wc.Credentials = New-Object System.Net.NetworkCredential("username","password")
$wc.DownloadString($url)
10
Sunny Chakraborty

다음은 저에게 효과적이며 (더 이상 사용되지 않는 최신 수단을 사용하여 SSL 인증서/콜백 기능과 상호 작용) 동일한 powershell 세션 내에서 동일한 코드를 여러 번로드하려고 시도하지 않습니다.

if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
{
[email protected]"
    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();

이것은 다음 기사에서 수정되었습니다 https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/

6

이 콜백 함수를 사용하여 SSL 인증서를 무시할 때 [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

나는 항상 당신이 가지고있는 결과처럼 들리는 오류 메시지 Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.를 받았습니다.

나는 이것을 포럼 게시물 찾았는데, 그것은 아래 기능으로 이어진다. 다른 코드 범위 내에서 이것을 한 번 실행하면 효과가 있습니다.

function Ignore-SSLCertificates
{
    $Provider = New-Object Microsoft.CSharp.CSharpCodeProvider
    $Compiler = $Provider.CreateCompiler()
    $Params = New-Object System.CodeDom.Compiler.CompilerParameters
    $Params.GenerateExecutable = $false
    $Params.GenerateInMemory = $true
    $Params.IncludeDebugInformation = $false
    $Params.ReferencedAssemblies.Add("System.DLL") > $null
    [email protected]'
        namespace Local.ToolkitExtensions.Net.CertificatePolicy
        {
            public class TrustAll : System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult(System.Net.ServicePoint sp,System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem)
                {
                    return true;
                }
            }
        }
'@ 
    $TAResults=$Provider.CompileAssemblyFromSource($Params,$TASource)
    $TAAssembly=$TAResults.CompiledAssembly
    ## We create an instance of TrustAll and attach it to the ServicePointManager
    $TrustAll = $TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager]::CertificatePolicy = $TrustAll
}
5
Aaron D

순수 powershell 의 대체 구현 ( c # 소스의 Add-Type없이) :

#requires -Version 5
#requires -PSEdition Desktop

class TrustAllCertsPolicy : System.Net.ICertificatePolicy {
    [bool] CheckValidationResult([System.Net.ServicePoint] $a,
                                 [System.Security.Cryptography.X509Certificates.X509Certificate] $b,
                                 [System.Net.WebRequest] $c,
                                 [int] $d) {
        return $true
    }
}
[System.Net.ServicePointManager]::CertificatePolicy = [TrustAllCertsPolicy]::new()
1
TheIncorrigible1

EM7 OpenSource REST API에서 문서를 검색하려고했습니다. 지금까지 운이 없습니다.

http://blog.sciencelogic.com/sciencelogic-em7-the-next-generation/05/2011

OpenSource REST API에 대해 많은 이야기가 있지만 실제 API 또는 문서에 대한 링크는 없습니다. 어쩌면 나는 참을성이 없었다.

시도해 볼 수있는 몇 가지 사항은 다음과 같습니다.

$a = Invoke-RestMethod -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert 
$a.Results | ConvertFrom-Json

API에서 얻는 열을 필터링 할 수 있는지 확인하려면 이것을 시도하십시오

$a.Results | ft

또는 이것을 사용해보십시오

$b = Invoke-WebRequest -Uri https://IPADDRESS/resource -Credential $cred -certificate $cert 
$b.Content | ConvertFrom-Json

컬 스타일 헤더

$b.Headers

Twitter JSON API로 IRM/IWR을 테스트했습니다.

$a = Invoke-RestMethod http://search.Twitter.com/search.json?q=PowerShell 

도움이 되었기를 바랍니다.

1

이것을 관리자 권한으로 실행하면 해당 오류가 사라집니다.

0
Autonomic

이러한 레지스트리 설정은 .NET Framework 4+ 및 PowerShell에 영향을줍니다. 재부팅하지 않고도 최신 TLS를 사용하도록 설정하고 PowerShell 세션을 다시 시작하십시오.

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord 

https://docs.Microsoft.com/en-us/dotnet/framework/network-programming/tls#schusestrongcrypto 참조

0
Jeremy Cook
  1. 이 명령을 실행

New-SelfSignedCertificate -certstorelocation 인증서 :\localmachine\my -dnsname {your-site-hostname}

admin rights를 사용하여 powershell에서 개인 디렉토리의 모든 인증서를 생성합니다.

  1. 프라이버시 오류를 제거하려면이 인증서를 선택하고 → 복사를 마우스 오른쪽 단추로 클릭하십시오. 신뢰할 수있는 루트 인증 기관/인증서에 붙여 넣습니다.
  2. 마지막 단계는 IIS에서 올바른 바인딩을 선택하는 것입니다. IIS 웹 사이트로 이동하여 바인딩, SNI 선택 선택란을 선택하고 각 웹 사이트의 개별 인증서를 설정하십시오.

웹 사이트 호스트 이름과 인증서 dns-name이 정확히 일치해야합니다

0