Ошибка Powershell v3 Invoke-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}
Может ли кто-нибудь дать какое-то руководство по поводу того, что здесь может быть неправильным, и как его исправить?
Спасибо
Ответы
Ответ 1
Эта работа работала для меня:
http://connect.microsoft.com/PowerShell/feedback/details/419466/new-webserviceproxy-needs-force-parameter-to-ignore-ssl-errors
В основном, в PowerShell script:
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"
Ответ 2
Ответ Ли велик, но у меня также были проблемы с протоколами, поддерживаемыми веб-сервером.
После добавления следующих строк я могу получить запрос https. Как указано в этом ответе fooobar.com/questions/92857/...
$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
Ответ 3
Вы пытались использовать 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)
Ответ 4
Следующее сработало для меня (и использует последние не устаревшие средства для взаимодействия с функциональностью SSL-сертификаты/обратного вызова) и не пытается загружать один и тот же код несколько раз в течение одного сеанса powershell:
if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type)
{
[email protected]"
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/
Ответ 5
Я обнаружил, что при использовании этой функции обратного вызова для игнорирования сертификатов SSL [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
Я всегда получал сообщение об ошибке Invoke-WebRequest: The underlying connection was closed: An unexpected error occurred on a send.
что звучит как результаты, которые вы получаете.
Я нашел это сообщение на форуме, которое привело меня к функции ниже. Я запускаю это один раз в рамках моего другого кода, и это работает для меня.
функция 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 = @"
пространство имен Local.ToolkitExtensions.Net.CertificatePolicy
{
открытый класс TrustAll: System.Net.ICertificatePolicy
{
public bool CheckValidationResult (System.Net.ServicePoint sp, System.Security.Cryptography.X509Certificates.X509Сертификат сертификации, требование System.Net.WebRequest, проблема int)
{
вернуть истину;
}
}
}
@
$ TAResults = $ Provider.CompileAssemblyFromSource($ Params, $ TASource)
$ TAAssembly = $ TAResults.CompiledAssembly
## Мы создаем экземпляр TrustAll и присоединяем его к ServicePointManager
$ TrustAll = $ TAAssembly.CreateInstance("Local.ToolkitExtensions.Net.CertificatePolicy.TrustAll")
[System.Net.ServicePointManager] :: CertificatePolicy = $ TrustAll
}
Ответ 6
Я попытался найти документацию по API-интерфейсу REST EM7 OpenSource. Пока не повезло.
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
$b.Headers
Я тестировал IRM/IWR с помощью twitter JSON api.
$a = Invoke-RestMethod http://search.twitter.com/search.json?q=PowerShell
Надеюсь, что это поможет.
Ответ 7
Альтернативная реализация в чистом powershell (без 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()
Ответ 8
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname {your-site-hostname}
в powershell с использованием прав администратора. Это приведет к созданию всех сертификатов в личном каталоге
- Чтобы избавиться от ошибки конфиденциальности, выберите эти сертификаты, щелкните правой кнопкой мыши → Копировать. И вставьте доверенный корневой центр сертификации/сертификаты.
- Последний шаг - выбрать правильные привязки в IIS. Перейдите на сайт IIS, выберите "Привязки", "Выбрать SNI" и установите индивидуальные сертификаты для каждого веб-сайта.
Убедитесь, что имя хоста веб-сайта и имя сертификата dns-name должны точно соответствовать
Ответ 9
Если вы запустите это как администратор, эта ошибка должна исчезнуть
Ответ 10
Эти параметры реестра влияют на .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