PowerShell 快速檢查 TLS 1.x 版本停用狀況
2 |
停用 TLS 1.0/1.1 如今已是弱掃軟體的標準檢查項目(相關背景知識可參考舊文),即使 Windows 沒裝網站,一些服務如 SQL Server/RDP 遠端桌面也跟 TLS 協定有關,沒停用 1.0/1.1 會被通報有弱點。
要停用 TLS 1.0/1.1,免費軟體 IISCrypto 提供了極友善的圖形化操作介面,各協定啟用狀態一目瞭然,透過勾選即可停用或啟用,並有命令列工具方便大量部署。如果不想依賴第三方工具,直接套用 Registry其實也能達到相同效果。
要查看協定啟用狀態,啟動 regedit 查看 HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\ 下各協定機碼即可:
嫌滑滑鼠點來點去檢查太沒效率,加上有點手癢(說穿了也是想找機會練習培養手感),我寫了以下 PowerShell 能一秒列出各 TLS 版本啟用設定:
# 列出所有 Cipher
Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers'
# 列出 Protocol 啟用狀況
Get-ChildItem -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\' -Recurse |
ForEach-Object {
$p = Get-ItemProperty -Path $_.PSPath
if ('Enabled' -in $p.PSObject.Properties.Name) {
$_.PSPath.Split(':')[2]
"Enabled = $($p.Enabled)"
}
}
過程學到兩則 PowerShell 存取 Registry 技巧:
- SecurityProviders\SCHANNEL\Protocols\TLS1.0\Server 機碼下的 Enabled、DisabledByDefault 等 DWORD 值算物件屬性,無法用 Get-ChildItem 列舉,直接寫 $regKeyObject.Enabled 即可;當不確定某個屬性是否存在時,可用 if ('Enabled' -in $regKeyObject.PSObject.Properties.Name) 方式檢查。
- 要取得機碼完整路徑,可先由 PSPath 得到 Microsoft.PowerShell.Core\RegistryHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\...,再取「」符號之後的部分。
實測範例如下:
PowerShell example: query registry to list all TLS protocol version enable/disable status.
Comments
# by kkbruce
其實在Server上打 [Net.ServicePointManager]::SecurityProtocol 就能看到啟用了那些TLS版本。
# by cloud
感謝介紹免費軟體 IISCrypto, 收下了