Soru Powershell v3 Invoke-WebRequest HTTPS hatası


Powershell v3'ün Invoke-WebRequest ve Invoke-RestMethod öğelerini kullanma Bir https web sitesine bir json dosyası göndermek için POST yöntemini başarıyla kullandım.

Kullandığım komut şu

 $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

Ancak GET yöntemini aşağıdaki gibi kullanmaya çalıştığımda:

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

Aşağıdaki hata döndürülüyor

 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 sertifikasını yok saymak için aşağıdaki kodu kullanmaya çalıştım ama aslında bir şey yapıp yapmadığından emin değilim.

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

Birisi burada neyin yanlış gittiğine ve nasıl düzeltileceğine dair bir kibarlık sağlayabilir mi?

Teşekkürler


76
2017-07-27 23:39


Menşei


Hangisini kullanıyorsun? Invoke-RestMethod veya Invoke-WebRequest? - svick
Çağır-WebRequest. Invoke-RestMethod'dan farklı olarak istek / resposne başlıklarını döndürdüğü için kullanırım. Yine de aynı parametreleri alan Invoke-RestMethod'u denedim. - floyd
Ne değerse, ServerValidationCallback olayı kesinlikle bir kırmızı ringa balığıdır, çünkü bir SSL doğrulama problemi olduğunda almanız gereken hata: Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.  Daha fazla bilgi için $ Error [0] .Exception.InnerException'ı keşfetmeyi deneyebilirsiniz ... - Jaykul


Cevaplar:


Bu çalışma benim için çalıştı: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

Temel olarak, PowerShell komut dosyanızda:

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"

120
2018-04-05 19:20



Not, bu cevap doğrudur; Ancak, başka bir cevap üzerinde yapılan nokta (stackoverflow.com/a/25163476/68432) ayrıca geçerlidir. Önceden "[System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true}" işlemini tamamladıysanız bu çözüm çalışmaz. - Paul Suart
Bu benim için çalıştı. - Trevor Sullivan
Aşağıda Arthur Strutzenberg cevabına göre Tip kondisyon kontrolünü eklemeniz ya da zaten var olan türü söyleyen bir hata alacaksınız. - Ralph Willgoss
Bunu üretimde kullanmak için bir güvenlik riski var mı? - Amjad
5 yıl sonra, bu hala PowerShell 5.1 (tam .NET Framework) çözümü. PowerShell Core için bir -SkipCertificateCheck şimdi. - evilSnobu


Lee'nin cevabı harika, ancak web sunucusunun hangi protokollerle desteklendiğiyle de ilgili sorunlar yaşadım.
Aşağıdaki satırları da ekledikten sonra, https isteğini iletebilirim. Bu cevapta belirtildiği gibi https://stackoverflow.com/a/36266735

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

Lee'nin koduyla tam çözümüm.

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

32
2017-09-16 13:43



40 tane betikiniz varsa daha iyi bir çözüm buldunuz, sonra her birine eklemelisiniz? Hiçbir anlam ifade etmiyor. Btw, cevap için teşekkürler - Ender
Lee'nin cevabı benim için çalışmadı. Referans ettiğin bitleri eklemeliydim ve IT WORKED! - Pat K
Protokolleri sorunun çözülmesine yardımcı olduğunu belirterek çok teşekkür ederim. - Alex
Teşekkürler, bana gösterdiğiniz için teşekkür ederim. SecurityProtocol genel statik özellik. Mesih, belirsizlikleri çözmeye çalışan diğer şeylerin sertifikalarını, güvenlerini, ağlarını, güzergâhlarını, izinlerini ve pisliklerini kontrol etmek için DAYS'i kaybettim. endpoint does not respondhttps aracılığıyla belirli bir sunucuya erişirken hata (tüm diğer işlemler işe yarar), sadece bu goddamn powershell 5.1 varsayılanı SSL3, TLS ve sadece SADECE BLOKLAR GODDAMN TLS11 ve TLS12 VARSAYILAN OLARAK Bu boktan ne kadar nefret ettiğimi, C # / Ruby / C ++ dosyasında ya da powershell olmayan başka bir şeyi yazmam gerek. - quetzalcoatl
^ .... en azından WinServer2012R2'de - quetzalcoatl


Kullanmayı denediniz mi 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)

8
2017-07-31 12:51



Sunny, bu kodu kullanırken aşağıdakileri alıyorum: "1" argümanıyla "DownloadString" çağrısında istisna (lar): "Uzak sunucu bir hata verdi: (406) Kabul Edilemez." Satırda: 4 karakter: 1 + $ ], MethodInvocationException + FullyQualifiedErrorId: WebException - floyd
406 kullanarak REST servisinin API belgelerine dayanarak im, "istekte bulunan kabul başlığının XML veya JSON yanıtına izin vermediğini" belirtir. - floyd
XML / JSON yanıtlarına izin verilmiyorsa hangi yanıt türlerine izin verilir? - Sunny Chakraborty
Bu, kullandığınız özel bir web hizmetidir? REST API'sı için halka açık herhangi bir belge var mı? - Sunny Chakraborty
EM7 adında bir biletleme sistemi olduğunu düşünüyorum. Hizmet JSON / XML yanıtını kabul ediyor (ben cURL kullanırsam iyi çalışır) Hatanın System.Net.WebClient isnt olduğunu gösterdiğine inanıyorum? - floyd


SSL sertifikalarını yoksaymak için bu geriçağırım işlevini kullandığımda buldum [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Her zaman hata mesajını aldım Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. sahip olduğunuz sonuçlara benziyor.

Bunu buldum forum gönderisi Beni aşağıdaki işleve yönlendirir. Bunu diğer kodumun kapsamında bir kez çalıştırıyorum ve benim için çalışıyor.

işlev Yoksay-SSLC sertifikaları
{
    $ Sağlayıcı = Yeni Nesne Microsoft.CSharp.CSharpCodeProvider
    $ Derleyici = $ Provider.CreateCompiler ()
    $ Params = Yeni Nesne System.CodeDom.Compiler.CompilerParameters
    $ Params.GenerateExecutable = $ false
    $ Params.GenerateInMemory = $ true
    $ Params.IncludeDebugInformation = $ false
    $ Params.ReferencedAssemblies.Add ("System.DLL")> $ null
    $ TASource = @'
        ad alanı Local.ToolkitExtensions.Net.CertificatePolicy
        {
            public class TrustAll: System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509 Sertifika Sertifikası, System.Net.WebRequest başvuru formu, int sorunu)
                {
                    gerçek geri dönüş;
                }
            }
        }
'@
    $ TAResults = $ Provider.CompileAssemblyFromSource ($ Parametreler, $ TASource)
    $ TAAssembly = $ TAResults.CompiledAssembly
    ## Bir TrustAll örneği oluşturup ServicePointManager'a ekliyoruz
    $ TrustAll = $ TAAssembly.CreateInstance ("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
}


4
2018-03-26 00:50





Aşağıdaki çalıştı benim için çalıştı (ve SSL Certs / geri arama işlevselliği ile etkileşim için en son kullanılmayan araçlarını kullanır) ve aynı powershell oturumunda aynı kodu birden çok kez yüklemeye çalışmaz:

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();

Bu aşağıdaki makaleden uyarlandı https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/


4
2017-08-02 19:33





EM7 OpenSource REST API'sı ile ilgili belgeleri aramayı denedim. Şimdiye kadar şans yok.

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

OpenSource REST API'sı hakkında çok fazla konuşma var, ancak gerçek API'ye veya herhangi bir belgeye bağlantı yok. Belki sabırsızımdır.

İşte deneyebileceğiniz birkaç şey var

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

API'den aldığınız sütunları filtreleyip filtrelemediğinizi görmek için bunu deneyin.

$a.Results | ft

ya da bunu kullanmayı deneyebilirsiniz

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

Curl Stil Üstbilgileri

$b.Headers

IRM / IWR'yi twitter JSON API ile test ettim.

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

Bu yardımcı olur umarım.


1
2017-08-01 03:21



Tüm yardımlarınız için teşekkür ederim. Ancak, şu anda benim için çalışmayan $ a = Invoke-RestMethod (...) komutudur. Bir HTTP sitesi için iyi çalışır, ancak EM7'nin yaptığı HTTPS'yi uyguladığınızda açıklanan hatayı döndürür. Bu Invoke-RestMethod ve Invoke-WebRequest içindir. Sadece bir Invoke-Command cmdlet'ini kullanıyorum ve curl yapıyordum. - floyd


  1. Bu komutu çalıştır

Yeni-SelfSignedCertificate -certstorelocation sertifikası: \ localmachine \ my -dnsname {siteniz-hostname}

kullanarak powershell içinde yönetici haklarıBu, Kişisel dizinde tüm sertifikaları üretecek

  1. Gizlilik hatasından kurtulmak için bu sertifikaları seçin, → Kopyala'ya sağ tıklayın. Ve Güvenilen Kök Sertifika Yetkilisi / Sertifikaları yapıştırın.
  2. Son adım, IIS'de doğru bağlamaları seçmektir. IIS web sitesine gidin, Ciltlemeler, SNI Seç onay kutusunu işaretleyin ve her web sitesi için ayrı sertifikaları ayarlayın.

Web sitesi ana makine adı ve sertifika dns-adının tam olarak eşleşmesi gerektiğinden emin olun.


0
2018-05-26 14:37





Bunu yönetici olarak çalıştırırsanız, o hata gitmeli


0
2018-06-21 17:08