通过 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
最近我在连接到 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