首页 > 解决方案 > Powershell 2.0 SecurityProtocolType vs Slack webhook

问题描述

更新:最后我被允许安装 Powershell 3,这让我可以访问 Invoke-WebRequest 模块。我最终不需要更新 .Net 框架或更改注册表来强制执行加密协议,如果有人发现自己处于类似情况,这些仍然是有效的解决方案。

我试图从我被迫使用 Powershell 2.0 的环境中访问我的 Slack webhook。Slack 服务器不喜欢任何可用的 Net.SecurityProtoType 类型(ssl3 或 tls)。我已经从 Slack 文档中确认这里需要 tls 1.2 或更高版本。我收到一条错误消息:

Exception calling "GetRequestStream" with "0" argument(s): "The underlying connection was closed: An unexpected error occurred on a send."
$PAYLOAD = @{"text" = "Slack message text"}

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::tls
$WebRequest = [System.Net.WebRequest]::Create("https://hooks.slack.com/services/")
$WebRequest.Method = "POST"
$WebRequest.ContentType = "application/json"

$bytes = [System.Text.Encoding]::ASCII.GetBytes($PAYLOAD)
$WebRequest.ContentLength = $bytes.Length

$Stream = [System.IO.Stream]$WebRequest.GetRequestStream()
$Stream.write($bytes, 0, $bytes.Length)

注:网址正确。它适用于具有较新版本 Powershell 的环境。

.Net 的版本是 4.0。我不认为我们可以更新这个。根据文档,有一些方法可以在 .Net 4.0 中获取 tls 1.2,但我非常不确定在注册表中修改协议的风险......

在我意识到 Invoke-WebRequest 不会发生之后,大部分代码来自我在这篇文章中找到的内容。我怀疑我的 JSON 编码可能不正确,但我也无法访问他们在那里使用的 ConvertTo-Json cmdlet。

谢谢阅读!这对我来说是一个非常艰难的过程。

标签: powershellpowershell-2.0slack-api

解决方案


要查看您的系统上可用的安全协议类型/版本,您可以执行:

[enum]::GetNames([System.Net.SecurityProtocolType])

幸运的是,结果不取决于您的 PowerShell 版本。Tls12因此,例如,如果 PowerShell 不可用,您不必将其升级到较新版本。但是您必须将 .NET 框架至少升级到 4.5 才能获得Tls12. 您可能使用的是比 4.5 更旧的版本。要找出您安装了哪个版本,您可以使用这篇文章,因为不幸的是,单行无法完成。

.NET Framework 4.8 中可用的安全协议:

SystemDefault
Ssl3
Tls
Tls11
Tls12
Tls13

推荐阅读