Exchange2010 升級SP3&RU32、啟用 TLS 1.2 實戰紀錄
本文記錄Exchange2010 的維護過程。
Exchange 2010 SP1 ->updatepack->SP3 → RU32 → TLS 1.2
前置環境檢查
Windows Server 2008 R2 SP1,
Exchange 2010 SP1
.NET Framework 4.8。
schannel版本是6.1.7601.28116
Visual C++ 2013 Runtime
本次維護的主要目的是將 Exchange 2010 更新至最後版本,
並加入 TLS 1.2 支援,同時保留 TLS 1.0,以維持舊系統與舊 Client 的相容性。
一、環境確認
開始施工前,先確認 Exchange Server 的角色及版本:
Get-ExchangeServer | fl Name,ServerRole,AdminDisplayVersion
確認實際 Exchange Build
單純查看 AdminDisplayVersion 不適合用來確認 Update Rollup,
因此可透過powershell直接查看 ExSetup.exe:
Get-Command ExSetup | ForEach {$_.FileVersionInfo} |
Format-List ProductVersion,FileVersion,FileName
確認schannel版本 可透過powershell直接查看指令如下
(Get-Item C:\Windows\System32\schannel.dll).VersionInfo.FileVersion
二、取得相關套件
建議直接由官網取得最新版本
Exchange2010-SP3-x64
Exchange Server 2010 SP3 Update Rollup 32
Visual C++ 2013 Runtime
UPdatepack
三、安裝順序
這次遇到的為集群環境分別是CAS2台,DB一台做DAG 的 Witness Server,後面再接兩台DB互相抄寫
DAG 環境應先確認:
- Active / Passive Database Copy 所在節點。
- Database Copy Status。
- Copy Queue Length / Replay Queue Length。
- DAG Witness 狀態。
- Database Activation Policy。
- CAS / Load Balancer 狀態。
升級順序分別為CAS2台輪流升級結束後,做witness的DB先升級,接著passive所屬的db server升級,最後切換再將最後一台DB升級
windows環境建議先安裝好,再執行sp3與RU32 安裝。
若該環境為單機環境,也是建議先將windows環境建置好後再進行exchange更新
四、確認 RU32 Build
(Get-Command ExSetup).FileVersionInfo |
fl ProductVersion,FileVersion
結果應為:
14.03.0513.000
即:
Exchange Server 2010 SP3 RU32
Build 14.3.513.0
五、RU32 後確認 Database 與服務
Get-MailboxDatabase -Status |
ft Name,Mounted
確認所有 Mailbox Database:
Mounted = True
確認 Exchange 自動啟動服務:
Get-Service MSExchange* |
? {$_.StartType -eq "Automatic"} |
ft Name,Status
六、問題紀錄:MSExchangeRPC 無法啟動
RU32 安裝完成並重新啟動後,
其他 Exchange Service、Mailbox Database 及 Mail Flow 均正常,
但發現:
Microsoft Exchange RPC Client Access
MSExchangeRPC
無法正常啟動。
手動執行:
Start-Service MSExchangeRPC
服務啟動失敗。
Event Viewer → Windows Logs → Application 出現:
Source : MSExchangeRPC
EventID : 1005
無法啟動 Microsoft Exchange RPC 服務,
因為已有其他處理程序登錄 EMSMDB 介面。
確認 Windows RPC
Get-Service RpcSs,RpcEptMapper |
ft Name,Status,StartType
兩項均正常:
RpcEptMapper Running
RpcSs Running
因此問題不是 Windows RPC Service 本身。
七、解決 EMSMDB / MSExchangeRPC 啟動衝突
檢查 Exchange Process:
tasklist /svc | findstr /i "MSExchange"
發現 Microsoft Exchange Information Store:
store.exe MSExchangeIS
已經先啟動,而 MSExchangeRPC 無法註冊 EMSMDB Interface。
測試以下順序:
Stop-Service MSExchangeIS
Start-Service MSExchangeRPC
Start-Service MSExchangeIS
結果:
MSExchangeRPC Running
MSExchangeIS Running
Mailbox Database 重新 Mounted,
Outlook 也恢復正常。
永久處理:Information Store 延遲啟動
再次重新啟動 Server 後,同樣的 EMSMDB 衝突再次發生,
確認並非單次 RU32 更新後的偶發問題。
因此將 Microsoft Exchange Information Store 改成
Automatic (Delayed Start):
sc.exe config MSExchangeIS start= delayed-auto
確認:
sc.exe qc MSExchangeIS
如此可讓 MSExchangeRPC 先完成 EMSMDB Interface 註冊,
Information Store 稍後再啟動。
若需要恢復原設定:
sc.exe config MSExchangeIS start= auto
修改後再次重新啟動 Server,
MSExchangeRPC 與 MSExchangeIS 均能自動正常啟動,
不再需要人工 Stop / Start Service。
八、確認 .NET Framework
查看目前 .NET Framework 版本:
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' |
Select Release,Version
結果:
Release : 528049
Version : 4.8.03761
系統已安裝 .NET Framework 4.8,
因此不需要另外安裝 .NET Framework 4.7 / 4.7.2。
九、啟用 TLS 1.2
本次目標是:
- 啟用 TLS 1.2。
- 讓 .NET 使用 Windows Schannel 的 TLS 設定。
- 保留 TLS 1.0 相容性。
- 不主動停用 TLS 1.0。
先備份 Registry
reg export "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL" C:\SCHANNEL-before-TLS12.reg
reg export "HKLM\SOFTWARE\Microsoft\.NETFramework" C:\NETFramework-before-TLS12.reg
十、設定 Schannel TLS 1.2
以 Administrator PowerShell 執行:
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2" -Force | Out-Null
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Force | Out-Null
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -Force | Out-Null
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name Enabled -Value 1 -PropertyType DWORD -Force
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -Name DisabledByDefault -Value 0 -PropertyType DWORD -Force
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -Name Enabled -Value 1 -PropertyType DWORD -Force
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -Name DisabledByDefault -Value 0 -PropertyType DWORD -Force
最後應為:
TLS 1.2\Client
Enabled = 1
DisabledByDefault = 0
TLS 1.2\Server
Enabled = 1
DisabledByDefault = 0
本次沒有修改 TLS 1.0 Client / Server Registry,
因此既有 TLS 1.0 支援維持原狀。
十一、設定 .NET Framework TLS
.NET 2.0 / 3.5
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727" -Name SystemDefaultTlsVersions -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727" -Name SchUseStrongCrypto -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727" -Name SystemDefaultTlsVersions -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727" -Name SchUseStrongCrypto -Value 1 -Type DWord
.NET 4.x
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name SystemDefaultTlsVersions -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name SchUseStrongCrypto -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name SystemDefaultTlsVersions -Value 1 -Type DWord
Set-ItemProperty "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name SchUseStrongCrypto -Value 1 -Type DWord
十二、確認 TLS Registry
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client"
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server"
確認:
Enabled : 1
DisabledByDefault : 0
檢查 .NET:
$paths = @(
"HKLM:\SOFTWARE\Microsoft\.NETFramework\v2.0.50727",
"HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727",
"HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319",
"HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319"
)
foreach ($p in $paths) {
Get-ItemProperty $p |
Select @{N="Path";E={$p}},SystemDefaultTlsVersions,SchUseStrongCrypto
}
四組均應為:
SystemDefaultTlsVersions : 1
SchUseStrongCrypto : 1
十三、重新啟動 Server
重新啟動後等待 Exchange Service 與 Mailbox Database 完整啟動。
確認:
Get-Service MSExchangeRPC,MSExchangeIS |
ft Name,Status,StartType
Get-MailboxDatabase -Status |
ft Name,Mounted
預期:
MSExchangeRPC Running
MSExchangeIS Running
Mailbox DB Mounted = True
十四、檢查 Schannel Event
Get-EventLog System -Newest 100 |
Where-Object {$_.Source -eq "Schannel"} |
ft TimeGenerated,EventID,EntryType,Message -Auto
若沒有持續大量 TLS / Schannel Error,
且實際 Client、SMTP、OWA 均正常,
即可持續觀察。