通过 PowerShell 在 FtpWebRequest 期间永久接受证书

Accept certificate permanently during FtpWebRequest via PowerShell

最近我在连接到 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();
}

有点老套,但您可以通过 Add-Type 在 PowerShell 中使用原始 C#。这是一个示例 class 我曾经能够在当前的 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()

请记住,仅修复您的服务证书以便验证真正成功会更安全。如果您无法控制环境,则忽略证书验证应该是您最后的选择。

[已更新] 在搜索 Invoke-RestRequest 时,我从 Microsoft 示例中找到了这个解决方案

注意:这实际上是接受任何证书

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

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

更多信息(感谢@Nimral):https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.servercertificatevalidationcallback?view=netcore-3.1