Pertanyaan Powershell v3 Kesalahan Invoke-WebRequest HTTPS


Menggunakan Powershell v3 Invoke-WebRequest dan Invoke-RestMethod Saya telah berhasil menggunakan metode POST untuk memposting file json ke situs web https.

Perintah yang saya gunakan adalah

 $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

Namun ketika saya mencoba menggunakan metode GET seperti:

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

Kesalahan berikut dikembalikan

 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

Saya telah mencoba menggunakan kode berikut untuk mengabaikan sertifikat SSL, tetapi saya tidak yakin apakah itu benar-benar melakukan sesuatu.

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

Dapatkah seseorang memberikan petunjuk tentang apa yang mungkin salah di sini dan cara memperbaikinya?

Terima kasih


76
2017-07-27 23:39


asal


Jawaban:


Pekerjaan ini berhasil untuk saya: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

Pada dasarnya, dalam skrip PowerShell Anda:

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"

119
2018-04-05 19:20



Jawaban Lee sangat bagus, tetapi saya juga memiliki masalah dengan protokol yang didukung server web.
Setelah menambahkan baris berikut, saya bisa mendapatkan permintaan https. Seperti yang ditunjukkan dalam jawaban ini https://stackoverflow.com/a/36266735

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

Solusi lengkap saya dengan kode 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

30
2017-09-16 13:43



Apakah Anda mencoba menggunakan 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



Saya menemukan bahwa ketika saya menggunakan fungsi panggilan balik ini untuk mengabaikan sertifikat SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Saya selalu mendapat pesan kesalahan Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. yang terdengar seperti hasil yang Anda alami.

aku menemukan ini posting forum yang mengarahkan saya ke fungsi di bawah ini. Saya menjalankan ini sekali di dalam lingkup kode saya yang lain dan itu bekerja untuk saya.

fungsi Abaikan-SSLCertifikat
{
    $ 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
        {
            TrustAll kelas publik: System.Net.ICertificatePolicy
            {
                publik bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem)
                {
                    kembali benar;
                }
            }
        }
'@
    $ TAResults = $ Provider.CompileAssemblyFromSource ($ Params, $ TASource)
    $ TAAssembly = $ TAResults.CompiledAssembly
    ## Kami membuat instance TrustAll dan melampirkannya ke ServicePointManager
    $ TrustAll = $ TAAssembly.CreateInstance ("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
}


4
2018-03-26 00:50



Berikut ini bekerja bekerja untuk saya (dan menggunakan cara-cara non-usang terbaru untuk berinteraksi dengan fungsi SSL Certs / callback), dan tidak mencoba untuk memuat kode yang sama beberapa kali dalam sesi PowerShell yang sama:

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

Ini diadaptasi dari artikel berikut https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/


4
2017-08-02 19:33



Saya mencoba mencari dokumentasi di EM7 OpenSource REST API. Belum ada keberuntungan sejauh ini.

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

Ada banyak pembicaraan tentang OpenSource REST API, tetapi tidak ada tautan ke API yang sebenarnya atau dokumentasi apa pun. Mungkin saya tidak sabaran.

Berikut beberapa hal yang bisa Anda coba

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

Coba ini untuk melihat apakah Anda dapat memfilter kolom yang Anda dapatkan dari API

$a.Results | ft

atau, Anda dapat mencoba menggunakan ini juga

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

Header Curl Style

$b.Headers

Saya menguji IRM / IWR dengan api JSON twitter.

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

Semoga ini membantu.


0
2017-08-01 03:21



  1. Jalankan perintah ini

New-SelfSignedCertificate -certstorelocation cert: \ localmachine \ my -dnsname {nama-situs-host Anda}

di PowerShell menggunakan hak admin, Ini akan menghasilkan semua sertifikat dalam direktori Pribadi

  1. Untuk menyingkirkan kesalahan Privasi, pilih sertifikat ini, klik kanan → Salin. Dan tempelkan di Otoritas Sertifikasi / Sertifikat Akar Tepercaya.
  2. Langkah terakhir adalah memilih binding yang benar di IIS. Pergi ke situs web IIS, pilih Bindings, Pilih SNI checkbox dan atur masing-masing sertifikat untuk setiap situs web.

Pastikan hostname situs web dan sertifikat dns-name harus sama persis


0
2018-05-26 14:37



Jika Anda menjalankan ini sebagai administrator, kesalahan itu harus hilang


0
2018-06-21 17:08