Powershell 2.0 SecurityProtocolType 与 Slack webhook
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 或更高版本 here。我收到一条错误消息:
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)
注:URL是正确的。它适用于具有较新版本的 Powershell 的环境。
.Net版本为4.0。我不认为我们可以更新这个。根据 this 文档,有一些方法可以在 .Net 4.0 中获取 tls 1.2,但我非常不确定在注册表中修改协议的风险...
此代码的大部分来自我在 this post 发现 Invoke-WebRequest 不会发生后发现的代码。我怀疑我的 JSON 编码有可能不正确,但我也无权访问他们在那里使用的 ConvertTo-Json cmdlet。
感谢阅读!这对我来说是一个非常艰难的过程。
要查看系统上可用的安全协议 types/versions,您可以执行:
[enum]::GetNames([System.Net.SecurityProtocolType])
幸运的是,结果不取决于您的 PowerShell 版本。因此,如果 Tls12
不可用,您不必将 PowerShell 升级到更新版本。但是您必须至少将您的 .NET Framework 升级到 4.5 才能获得 Tls12
。您可能正在使用比 4.5 更旧的版本。要查明您安装的是哪个版本,您可以使用 this article,因为很遗憾,单行无法完成。
.NET Framework 4.8 中可用的安全协议:
SystemDefault
Ssl3
Tls
Tls11
Tls12
Tls13
更新:最后我被允许安装 Powershell 3,这让我可以访问 Invoke-WebRequest 模块。我最终不需要更新 .Net 框架或更改注册表来强制执行加密协议,如果有人发现自己处于类似情况,这些仍然是有效的解决方案。
我试图在我被迫使用 Powershell 2.0 的环境中访问我的 Slack webhook。 Slack 服务器不喜欢任何可用的 Net.SecurityProtoType 可用类型(ssl3 或 tls)。我已经从 Slack 文档中确认需要 tls 1.2 或更高版本 here。我收到一条错误消息:
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)
注:URL是正确的。它适用于具有较新版本的 Powershell 的环境。
.Net版本为4.0。我不认为我们可以更新这个。根据 this 文档,有一些方法可以在 .Net 4.0 中获取 tls 1.2,但我非常不确定在注册表中修改协议的风险...
此代码的大部分来自我在 this post 发现 Invoke-WebRequest 不会发生后发现的代码。我怀疑我的 JSON 编码有可能不正确,但我也无权访问他们在那里使用的 ConvertTo-Json cmdlet。
感谢阅读!这对我来说是一个非常艰难的过程。
要查看系统上可用的安全协议 types/versions,您可以执行:
[enum]::GetNames([System.Net.SecurityProtocolType])
幸运的是,结果不取决于您的 PowerShell 版本。因此,如果 Tls12
不可用,您不必将 PowerShell 升级到更新版本。但是您必须至少将您的 .NET Framework 升级到 4.5 才能获得 Tls12
。您可能正在使用比 4.5 更旧的版本。要查明您安装的是哪个版本,您可以使用 this article,因为很遗憾,单行无法完成。
.NET Framework 4.8 中可用的安全协议:
SystemDefault
Ssl3
Tls
Tls11
Tls12
Tls13