Câu hỏi Lỗi Powershell v3 Invoke-WebRequest HTTPS


Sử dụng Invoke-WebRequest của Powershell v3 và Invoke-RestMethod Tôi đã sử dụng thành công phương thức POST để đăng một tệp json lên một trang web https.

Lệnh tôi đang sử dụng là

 $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

Tuy nhiên, khi tôi cố gắng sử dụng phương thức GET như:

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

Lỗi sau được trả về

 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

Tôi đã cố gắng sử dụng mã sau đây để bỏ qua SSL cert, nhưng tôi không chắc chắn nếu nó thực sự làm bất cứ điều gì.

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

Ai đó có thể cung cấp một số hướng dẫn về những gì có thể đi sai ở đây và làm thế nào để sửa chữa nó?

Cảm ơn


76
2017-07-27 23:39


gốc


Vậy bạn đang sử dụng cái nào? Invoke-RestMethod hoặc là Invoke-WebRequest? - svick
Gọi-WebRequest. Tôi sử dụng nó khi nó trả về các tiêu đề yêu cầu / resposne không giống như Invoke-RestMethod. Tuy nhiên tôi đã thử Invoke-RestMethod mà có thông số giống hệt nhau là tốt. - floyd
Đối với những gì nó có giá trị, các ServerValidationCallback điều gần như chắc chắn là một cá trích đỏ, kể từ khi lỗi bạn sẽ nhận được khi bạn có một vấn đề xác nhận SSL shoudl SAY rằng: Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.  Bạn có thể thử khám phá $ Error [0] .Exception.InnerException để biết thêm thông tin ... - Jaykul


Các câu trả lời:


Điều này làm việc xung quanh làm việc cho tôi: http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors

Về cơ bản, trong kịch bản PowerShell của bạn:

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



Lưu ý, câu trả lời này là chính xác; tuy nhiên, điểm được đưa ra trên một câu trả lời khác (stackoverflow.com/a/25163476/68432) cũng hợp lệ. Giải pháp này sẽ không hoạt động nếu bạn đã thực hiện trước "[System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true}". - Paul Suart
Điều này làm việc cho tôi. - Trevor Sullivan
Bạn cần phải thêm kiểm tra điều kiện Loại theo câu trả lời của Arthur Strutzenberg bên dưới hoặc bạn sẽ gặp lỗi khi nói rằng loại đã tồn tại - Ralph Willgoss
Có nguy cơ bảo mật khi sử dụng trong sản xuất không? - Amjad
5 năm sau, đó vẫn là giải pháp cho PowerShell 5.1 (đầy đủ .NET Framework). Đối với PowerShell Core, có -SkipCertificateCheck hiện nay. - evilSnobu


Câu trả lời của Lee rất tuyệt, nhưng tôi cũng gặp vấn đề với giao thức mà máy chủ web hỗ trợ.
Sau khi thêm các dòng sau, tôi có thể nhận được yêu cầu https thông qua. Như đã chỉ ra trong câu trả lời này https://stackoverflow.com/a/36266735

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

Giải pháp đầy đủ của tôi với mã của 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

32
2017-09-16 13:43



bạn đã tìm thấy giải pháp tốt hơn, coz nếu bạn có 40 kịch bản sau đó bạn phải thêm nó vào mỗi ?. Có vẻ như không có ý nghĩa gì cả. Btw, cảm ơn câu trả lời - Ender
Câu trả lời của Lee không hiệu quả với tôi. Tôi đã phải thêm các bit bạn tham chiếu và CNTT LÀM VIỆC! - Pat K
Cảm ơn bạn rất nhiều, chỉ định các giao thức đã giúp giải quyết vấn đề - Alex
Cảm ơn bạn cảm ơn bạn đã cho tôi thấy SecurityProtocol thuộc tính tĩnh toàn cầu. Chúa ơi, tôi vừa mất DAYS khi kiểm tra giấy chứng nhận, tín thác, mạng, tuyến đường, quyền truy cập và những thứ khác đang cố giải quyết mơ hồ endpoint does not respondlỗi khi truy cập vào một máy chủ cụ thể qua https (tất cả các công việc khác), chỉ vì đó là sức mạnh khủng bố 5.1 mặc định là SSL3, TLS và JUST KHỐI GODDAMN TLS11 và TLS12 B DNG DEFAULT chúa tôi ghét cái crap này thế nào, tôi nên viết kịch bản đó trong C # / Ruby / C ++, hoặc bất cứ thứ gì khác không phải là sức mạnh - quetzalcoatl
^ .... ít nhất là trên WinServer2012R2 - quetzalcoatl


Bạn đã thử sử dụng chưa 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, tôi nhận được thông tin sau khi sử dụng mã đó: Ngoại lệ gọi "DownloadString" với đối số "1": "Máy chủ từ xa trả về lỗi: (406) Không được chấp nhận". Tại dòng: 4 char: 1 + $ wc.DownloadString ($ url) + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [ ], MethodInvocationException + FullyQualifiedErrorId: WebException - floyd
Dựa trên tài liệu API của dịch vụ REST im sử dụng 406 cho biết "rằng tiêu đề chấp nhận được bao gồm trong yêu cầu không cho phép phản hồi XML hoặc JSON" - floyd
Các loại phản hồi nào được cho phép nếu các phản hồi XML / JSON không được phép? - Sunny Chakraborty
Đây có phải là dịch vụ web tùy chỉnh mà bạn đang sử dụng không? Có bất kỳ tài liệu công khai nào có sẵn cho API REST không? - Sunny Chakraborty
Nó là một hệ thống bán vé được gọi là EM7 Tôi không tin rằng họ có tài liệu công cộng. Dịch vụ này chấp nhận phản hồi JSON / XML (chỉ hoạt động tốt nếu tôi sử dụng cURL) Tôi tin rằng lỗi này chỉ ra rằng System.Net.WebClient isnt? - floyd


Tôi thấy rằng khi tôi sử dụng chức năng gọi lại này để bỏ qua chứng chỉ SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Tôi luôn nhận được thông báo lỗi Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send. có vẻ như kết quả bạn đang có.

tôi đã tìm thấy cái này bài đăng trên diễn đàn dẫn tôi đến hàm dưới đây. Tôi chạy điều này một lần bên trong phạm vi của mã khác của tôi và nó hoạt động cho tôi.

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 = @ '
        không gian tên Local.ToolkitExtensions.Net.CertificatePolicy
        {
            lớp công khai TrustAll: System.Net.ICertificatePolicy
            {
                public bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Net.WebRequest req, int problem)
                {
                    trả lại đúng;
                }
            }
        }
'@
    $ TAResults = $ Provider.CompileAssemblyFromSource ($ Params, $ TASource)
    $ TAAssembly = $ TAResults.CompiledAssembly
    ## Chúng ta tạo một thể hiện của TrustAll và đính kèm nó vào ServicePointManager
    $ TrustAll = $ TAAssembly.CreateInstance ("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
    [System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
}


4
2018-03-26 00:50





Sau đây đã làm việc cho tôi (và sử dụng các phương tiện không được sử dụng mới nhất để tương tác với chức năng SSL Certs / callback) và không cố tải cùng một mã nhiều lần trong cùng một phiên powerhell:

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

Điều này đã được điều chỉnh từ bài viết sau https://d-fens.ch/2013/12/20/nobrainer-ssl-connection-error-when-using-powershell/


4
2017-08-02 19:33





Tôi đã thử tìm kiếm tài liệu trên API REST của EM7 OpenSource. Không may mắn cho đến nay.

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

Có rất nhiều cuộc nói chuyện về API REST nguồn mở, nhưng không có liên kết đến API thực tế hoặc bất kỳ tài liệu nào. Có lẽ tôi đã thiếu kiên nhẫn.

Dưới đây là một vài điều bạn có thể thử

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

Hãy thử điều này để xem liệu bạn có thể lọc ra các cột mà bạn đang nhận được từ API hay không

$a.Results | ft

hoặc, bạn có thể thử sử dụng nó

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

Đầu đề kiểu Curl

$b.Headers

Tôi đã thử nghiệm IRM / IWR với api JSON twitter.

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

Hi vọng điêu nay co ich.


1
2017-08-01 03:21



Cảm ơn vì sự hỗ trợ của bạn. Tuy nhiên lệnh đầu tiên $ a = Invoke-RestMethod (...) là lệnh hiện không hoạt động đối với tôi. Hoạt động tốt cho một trang web HTTP nhưng khi bạn giới thiệu HTTPS EM7 nào nó trả về lỗi được mô tả. Đó là cho Invoke-RestMethod và Invoke-WebRequest. Tôi đang trong quá trình chỉ sử dụng một lệnh ghép ngắn Invoke-Command và chạy curl. - floyd


  1. Chạy lệnh này

New-SelfSignedCertificate -certstorelocation cert: \ localmachine \ my -dnsname {your-site-hostname} của bạn

trong PowerShell sử dụng quyền quản trị, Điều này sẽ tạo tất cả các chứng chỉ trong thư mục Cá nhân

  1. Để loại bỏ Lỗi bảo mật, hãy chọn các chứng chỉ này, nhấp chuột phải → Sao chép. Và dán vào Trusted Root Certification Authority / Certificates.
  2. Bước cuối cùng là chọn đúng các ràng buộc trong IIS. Truy cập trang web IIS, chọn Bindings, chọn SNI checkbox và thiết lập các chứng chỉ riêng cho từng trang web.

Đảm bảo tên máy chủ lưu trữ trang web và chứng chỉ dns-name phải khớp chính xác


0
2018-05-26 14:37





Nếu bạn chạy quản trị viên này, lỗi đó sẽ biến mất


0
2018-06-21 17:08