2018-03-22

Client 連接 RDS 時出現 [無法執行憑證的撤銷檢查] 錯誤

遇到一個奇怪的問題
某幾台 Windows 7 在連接 RDS (Remote Desktop Service) 的時候
不知何故會出現下圖:

錯誤為: 無法執行憑證的撤銷檢查

英文為: A revocation check could not be performed for the certificate



憑證撤銷清單是以 http Web 的方式提供, 其他 Client 完全正常
且這台有問題的 Windows 7 也確認可以用 Browser 正確取得憑證撤銷清單


即使將這台 Windows 7 進行 Windows Update 到最新 (2018.03) 也仍會出現一樣的錯誤
雖然按下 [是] 就能繼續使用, 但多一個警告視窗出來對 User 來說是相當不便且缺乏信任的

經過了整整兩天的掙扎後, 終於找到了避開這個錯誤的方式 (治標不治本, 英文叫做 Workaround)


首先在這篇文章中找到一個註冊機碼

https://serverfault.com/questions/591154/remote-desktop-certificate-error-how-to-connect-anyways

在 Client 端新增這個設定之後就能避開這個錯誤, 順利連線不會跳警告視窗

Action: Create
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Microsoft\Terminal Server Client
Value name: AuthenticationLevelOverride
Value Type: REG_DWORD
Value data: 00000000
Hexadecimal
這個設定可以用 GPO 派送, 詳細作法在此不贅述
但這個做法有許多問題
首先是之後這個 Client 連接其他 RDS 也都不會再驗證憑證撤銷清單, 有安全疑慮
第二是若 Client 非 Domain Computer 就無法套用這個設定, 仍會出現這個錯誤
雖然說如果是自發憑證尚有信任的根憑證這件事情要解決
但如果是公開憑證可能還是會有這個問題 (未測試不知是否如此)

於是繼續尋找其他解決方案, 接著在這篇文章中找到了比較好一點的辦法

https://social.technet.microsoft.com/Forums/en-US/01b1c79f-8fb9-4b27-8326-d6401bd43446/win2012-r2-problem-with-certificate-in-rds-farm?forum=winserverTS

這是在 RDCB 上面進行設定, 在派送 .rdp File 時將設定寫在裡面的辦法

比起前面去改 Client 設定的方式好多了, 不但不用處理 Client
也可以避免一旦處理了 Client 變成不管連誰都不用驗證憑證撤銷清單的疑慮

Session Collection 的話用這樣

Set-RDSessionCollectionConfiguration -CollectionName YourCollectionName -CustomRdpProperty "authentication level:i:0"
Virtual Desktop Collection 的話用這樣
Set-RDVirtualDesktopCollectionConfiguration -CollectionName YourCollectionName  -CustomRdpProperty "authentication level:i:0"
本來想用很簡單的兩行指令來結束這一回合, 但不知為何後面 Set 的指令就是不吃前面 Get 到的 Collection
Get-RDSessionCollection | Set-RDSessionCollectionConfiguration -CustomRdpProperty "authentication level:i:0"
Get-RDVirtualDesktopCollection | Set-RDVirtualDesktopCollectionConfiguration -CustomRdpProperty "authentication level:i:0"
於是只好很笨的多寫了一個 ForEach 來做這件事情

Session Collection 的話用這樣

$RDSessionCollectionName = Get-RDSessionCollection | select CollectionName
ForEach ($Collection in $RDSessionCollectionName) 
{
Set-RDSessionCollectionConfiguration -CollectionName $Collection.CollectionName -CustomRdpProperty "authentication level:i:0"
}
Virtual Desktop Collection 的話用這樣
$RDVirtualDesktopCollectionName = Get-RDVirtualDesktopCollection | select CollectionName
ForEach ($Collection in $RDVirtualDesktopCollectionName) 
{
Set-RDVirtualDesktopCollectionConfiguration -CollectionName $Collection.CollectionName -CustomRdpProperty "authentication level:i:0"
}
把它寫成 .ps1 之後如果新建 Collection 的話就執行一下就好了

接著我細膩的思路(龜毛)就想到了這樣只知道能加參數進去
但這些參數放在哪裡? 如果我要移除怎麼辦?
可惜並沒有一個叫做 Remove-RDVirtualDesktopCollectionConfiguration 的指令存在

於是繼續尋找, 在下面這個討論中找到了答案

https://social.technet.microsoft.com/wiki/contents/articles/15719.adding-custom-rdp-properties-in-windows-server-2012-vdi-rds-environments.aspx

CustomRdpProperty 的值並不存在 SQL DataBase 裡

而是存放在 RDCB 的註冊機碼中 (拜託這哪招阿? 有 DB 不用要寫在註冊機碼裡)
路徑如下:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
Terminal Server\CentralPublishedResources\PublishedFarms\
YourCollectionName\DeploymentSettings]
"CustomRDPSettings"="authentication level:i:0
use redirection server name:i:1
"
需要注意他有用兩個雙引號 " Quote 起來, 且裡面的設定值有換行
文章中也提到如果你需要一次派送多個自訂值
可以用 `n 這個分行符號來分隔以便一個指令就全部加完, 類似這樣:
Set-RDSessionCollectionConfiguration -CollectionName YourCollectionName -CustomRdpProperty "drivestoredirect:s:C: `n displayconnectionbar:i:0"
到此我又有另一個問題, 他把這個設定值存在註冊機碼裡
但我 RDCB 有做 HA 啊! 如果不是存在 DB 裡面共同讀取的話
難道要去另一台 RDCB 手動改註冊機碼?

還好, 馬上進行驗證後發現
他有很聰明地把設定值寫入另一台 RDCB 的註冊機碼中
但由於 PowerShell 指令只能把設定值寫入, 不能把設定值移除, 且設定值不是存在 DB 中
所以萬一需要更改, 應該還是必須要去兩台 RDCB 的註冊機碼手動個別處理

沒有留言: