Принять сертификат навсегда во время FtpWebRequest через PowerShell - PullRequest
0 голосов
/ 16 мая 2018

Недавно я столкнулся с некоторыми проблемами при подключении к FTP-серверу, но появится всплывающее окно с просьбой принять сертификат.

Я не знаю, как преодолеть это через PowerShell во время вызова метода $ftpRequest.GetResponse(). Я нашел какое-то решение относительно переопределения метода обратного вызова в сертификате, как этот [System.Net.ServicePointManager]::ServerCertificateValidationCallback

Решение дано на C #, и я пока не знаю, как его перенести на PowerShell.

Мой код, как показано ниже

function Create-FtpDirectory {
    param(
        [Parameter(Mandatory=$true)]
        [string]
        $sourceuri,
        [Parameter(Mandatory=$true)]
        [string]
        $username,
        [Parameter(Mandatory=$true)]
        [string]
        $password
    )
    if ($sourceUri -match '\\$|\\\w+$') { throw 'sourceuri should end with a file name' }
    $ftprequest = [System.Net.FtpWebRequest]::Create($sourceuri);    

    Write-Information -MessageData "Create folder  to store backup (Get-FolderName -Path $global:backupFolder)"
    $ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::MakeDirectory
    $ftprequest.UseBinary = $true

    $ftprequest.Credentials = New-Object System.Net.NetworkCredential($username,$password)
    $ftprequest.EnableSsl = $true        

    $response = $ftprequest.GetResponse();

    Write-Host "Folder created successfully, status $response.StatusDescription"

    $response.Close();
}

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

При поиске Invoke-RestRequest я нашел это решение на примере Microsoft

# Next, allow the use of self-signed SSL certificates.

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

https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Utility/Invoke-RestMethod?view=powershell-4.0

0 голосов
/ 16 мая 2018

Это немного странно, но вы можете использовать необработанный C # в PowerShell через Add-Type. Вот пример класса, который я использовал, чтобы иметь возможность переключать проверку сертификата в текущем сеансе PowerShell.

if (-not ([System.Management.Automation.PSTypeName]'CertValidation').Type)
{
    Add-Type @"
        using System.Net;
        using System.Net.Security;
        using System.Security.Cryptography.X509Certificates;
        public class CertValidation
        {
            static bool IgnoreValidation(object o, X509Certificate c, X509Chain ch, SslPolicyErrors e) {
                return true;
            }
            public static void Ignore() {
                ServicePointManager.ServerCertificateValidationCallback = IgnoreValidation;
            }
            public static void Restore() {
                ServicePointManager.ServerCertificateValidationCallback = null;
            }
        }
"@
}

Затем вы можете использовать его до вызова вашей функции следующим образом.

[CertValidation]::Ignore()

И позже восстановить проверку сертификата по умолчанию следующим образом.

[CertValidation]::Restore()

Имейте в виду, что гораздо безопаснее просто исправить сертификат вашей службы, чтобы проверка действительно прошла успешно. Игнорирование проверки сертификата должно быть вашим последним средством, если вы не контролируете окружающую среду.

...