【问题标题】:Unable to download files from site via Powershell. Issue appears related to TLS 1.2无法通过 Powershell 从站点下载文件。问题似乎与 TLS 1.2 有关
【发布时间】:2020-10-20 22:18:20
【问题描述】:

两天前,一个值得信赖的继承的 powershell 脚本开始失败,并显示一个

请求被中止:无法创建 SSL/TLS 安全通道。”错误。

由于内部没有 Powershell 专家,我去谷歌搜索,问题似乎是 Powershell 默认使用 TLS 1.0。我使用https://www.ssllabs.com/ssltest/ 确认该站点支持 1.2,但现在不支持 1.0。完美,有很多网站提到要插入: [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 进入代码。但是,无论我如何尝试实现那行代码;它仍然失败并出现同样的错误。我尝试从头开始编写一个不太复杂的 Powershell 脚本,但修复后错误仍然存​​在。

原代码:

#$storageDir = "E:\Folder"<br>
#$webclient = New-Object System.Net.WebClient<br>
#$url = "https://jibber.website.com/DBBackup.jsp?userName=BOB&password=l33t"<br>
#$sb = new-object System.Text.StringBuilder<br>
#$file = "$storageDir\backup.zip"<br>
#wget $url -OutFile $file<br>

#$file = (new-object Net.WebClient).DownloadString($url)<br>
#echo "I have the link ($url)"<br>
#echo "going to download"<br>
#$to = "$storageDir\backup.zip"<br>
#$target = "$storageDir\backup"<br>
#$webclient.DownloadFile($file,$to)<br>
New-Item E:\folder\backup -type directory<br>
$downloadRequest = Invoke-WebRequest -UseBasicParsing –Uri  'https://jibber.website.com/DBBackup.jsp?userName=BOB&password=l33t'<br> 
$url =  $downloadRequest.Links<br>
(New-Object Net.WebClient).DownloadFile($url.href,'E:\folder\backup\backup.zip');

无论我尝试在何处或如何插入:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 

它继续失败。我确定我错过了一些愚蠢的东西,但是我应该如何以及在哪里将其实现到上面的代码中?

PS:我完全愿意使用不同的脚本来下载和放置文件。请记住,该站点使用“数据库备份链接:此处。此链接将使用 1 周。”获取文件的链接。

编辑:因此,在一些帮助下,我们确定该问题具体发生在服务器上。因此,该脚本适用于其他机器上的 [Net.ServicePointManager]::SecurityProtocol = "tls12" 调用,但不适用于服务器。理论上是 powershell 似乎无法正确访问 .netframework ......但我还没有解决这个问题。

【问题讨论】:

  • 当我设置这个 >>> [Net.ServicePointManager]::SecurityProtocol = 'tls12, tls11, tls'
  • @Lee_Dailey 这就是我的理解。但是,将其放在上面代码的开头似乎没有任何效果。
  • 您可以在新控制台中运行它而不会出现任何错误吗?我怀疑您无权访问所需的 dotnet 版本......但我不知道如何测试它。 [脸红]
  • @Lee_Dailey 我认为你是对的。我的一位同事仅在他的本地机器上解决了它并让它工作。我对文件位置做了一些小调整,它在我的本地机器上运行良好。不管是什么问题,都是在服务器上运行的时候(我应该在本地做更多的测试——从头到尾)。我正在尝试整个打开 Windows 功能等(对于 4.5,但仍然卡住。无论哪种方式,它现在肯定闻起来像一个 .net 框架问题。当我让它在服务器上工作时,我会希望更新。
  • 祝你好运! [咧嘴]

标签: powershell tls1.2


【解决方案1】:

尝试添加这个:

if ( -not ("TrustAllCertsPolicy" -as [type])) {
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
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'

【讨论】:

  • 好吧,“按原样”粘贴它只是为了测试,它会抛出“字符串终止符前不允许有空格”。我删除了消除错误的前面的空格。然后我尝试将其添加到代码的开头,但问题仍然存在。你的剪辑是不是一开始就去了其他地方?
  • 它必须在执行网络请求之前声明。通常它可以解决我遇到的任何 SSL/TLS 问题...检查上面的更新代码。也许会有所帮助。把它放在你的脚本之上。
【解决方案2】:

也许您想检查客户端和网站是否都支持 TLS 协议。 有一个优秀的免费(!)工具:https://www.nartac.com/Products/IISCrypto/ 您可以在您的机器上运行 IISCrypto 并查看支持的内容。它还可以应用设置。

可能你无法控制“另一方”。在同一页面上,您可以输入“对方”的网址。您将被重定向到https://SSLlabs.com,该站点将生成报告。需要几分钟,但您可以轻松查看他们支持的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2023-01-31
    • 2020-12-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多