Powershell v3 Invoke-WebRequest HTTPS 오류
Powershell v3의 Invoke-WebRequest와 Invoke-RestMethod를 사용하여 POST 메서드를 사용하여 https 웹사이트에 json 파일을 게시했습니다.
제가 사용하는 명령어는
$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}
여기서 문제가 발생할 수 있는 부분과 해결 방법에 대한 지침을 제공할 수 있는 사람이 있습니까?
감사해요.
이 회피책은 도움이 되었습니다.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"
Lee의 답변은 훌륭하지만 웹 서버가 지원하는 프로토콜에 대해서도 문제가 있었습니다.
다음 행도 추가하면 https 요청을 통과시킬 수 있었습니다.이 답변에서 지적된 바와 같이 https://stackoverflow.com/a/36266735
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
리의 코드에 대한 나의 완전한 해결책.
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
순수한 파워셸에서의 대체 구현(없음)Add-Type
c# 소스:
#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()
호출-WebRequest "DomainName" - SkipCertificateCheck
SkipCertificateCheck 파라미터를 사용하면 이 파라미터는 1줄 명령어로 사용할 수 있습니다(이 파라미터는 CORE PSEDION에서만 지원됩니다).
사용해보셨나요?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)
다음 방법이 효과가 있었습니다(또한 권장되지 않는 최신 수단을 사용하여 SSL 증명서/콜백 기능과 상호 작용).또한 동일한 powershell 세션 내에서 동일한 코드를 여러 번 로드하려고 하지 않습니다.
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();
이는 다음 기사 https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/에서 개작되었습니다.
이 콜백 함수를 사용하여 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
$TASource=@'
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
}
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
이게 도움이 됐으면 좋겠다.
이러한 레지스트리 설정은 영향을 줍니다.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://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls#schusestrongcrypto 를 참조해 주세요.
- 이 명령어 실행
New-SelfSignedCertificate - certstorelocation cert:\localmachine\my -dnsname {your-site-hostname}
관리자 권한을 사용하는 powershell에서 퍼스널디렉토리의 모든 증명서가 생성됩니다.
- 개인 정보 오류를 제거하려면 이러한 인증서를 선택하고 → 복사를 마우스 오른쪽 버튼으로 클릭합니다.또한 신뢰할 수 있는 루트 인증 기관/인증서에 붙여넣습니다.
- 마지막 단계는 IIS에서 올바른 바인딩을 선택하는 것입니다.IIS 웹 사이트로 이동하여 바인딩, SNI 선택 확인란을 선택하고 각 웹 사이트에 대한 개별 인증서를 설정합니다.
웹 사이트 호스트 이름과 인증서 dns-name이 정확히 일치하는지 확인하십시오.
언급URL : https://stackoverflow.com/questions/11696944/powershell-v3-invoke-webrequest-https-error
'programing' 카테고리의 다른 글
로컬 스토리지와 쿠키 (0) | 2023.04.10 |
---|---|
문자열이 숫자인지 식별 (0) | 2023.04.10 |
현재 회선 번호는 어떻게 알 수 있나요? (0) | 2023.04.10 |
SQL에서 테이블의 마지막 레코드를 선택하려면 어떻게 해야 합니다. (0) | 2023.04.10 |
초보자용 Git:최종적인 실용적인 가이드 (0) | 2023.04.10 |