PowerShell версии 3 вызова-запросы WebRequest ошибки https
С помощью Powershell v3 Invoke-WebRequest и Invoke-RestMethod я успешно использовал метод POST для публикации файла json на веб-сайте https.
команда, которую я использую
$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}
может ли кто-нибудь предоставить некоторые рекомендации о том, что может быть не так здесь и как это исправить?
спасибо
9 ответов:
эта работа-вокруг меня работал: 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"
ответ ли велик, но у меня также были проблемы с тем, какие протоколы поддерживает веб-сервер.
После добавления следующих строк я мог бы получить запрос 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
вы пробовали использовать
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-сертификаты
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Я всегда получал сообщение об ошибке
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
который звучит как результаты, которые вы имеете.Я нашел это сообщение на форуме что приводит меня к функции ниже. Я запускаю это один раз в области моего другого кода, и это работает для меня.
следующее работало для меня (и использует последние не устаревшие средства для взаимодействия с функциями ssl Certs/callback) и не пытается загружать один и тот же код несколько раз в одном сеансе 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/
Я пытался искать документацию на этого em7 открытым исходным кодом API-интерфейса REST. Пока не везет.
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
Curl Style Headers
$b.Headers
я протестировал IRM/IWR с помощью api twitter JSON.
$a = Invoke-RestMethod http://search.twitter.com/search.json?q=PowerShell
надеюсь, что это помогает.
- выполнить команду
New-SelfSignedCertificate-certstorelocation cert:\localmachine\my-dnsname {your-site-hostname}
в powershell с помощью права администратора, это будет генерировать все сертификаты в личный каталог
- чтобы избавиться от ошибки конфиденциальности, выберите эти сертификаты, щелкните правой кнопкой мыши → копировать. И вставьте в доверенный корневой Центр сертификации / сертификаты.
- последний шаг-выбрать правильный привязки в IIS. Перейдите на веб-сайт IIS, выберите привязки, установите флажок SNI и установите отдельные сертификаты для каждого веб-сайта.
убедитесь, что имя хоста сайта и DNS-имя сертификата должны точно соответствовать
эти параметры реестра влияют на .NET Framework 4+ и, следовательно, PowerShell. Установите их и перезапустите все сеансы PowerShell, чтобы использовать последний TLS, перезагрузка не требуется.
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