這是在某一天開發網站的社群帳號登入功能時發生的事情,因為碰到要介接的Http服務要求redirect回網站時須採用 Https ,因此在開發階段需啟用SSL,即Visual Studio須在debug階段就啟用SSL。
往常開發網站或API時,只需要考慮Http即可,因為Https通常是直接設定在IIS上即可,故開發過程中通常是可以忽略的,相對較少的情境才會需要在debug開發時就需要Https;要使用Https也不難,就是要知道設定在哪就好。
因為當時電腦環境更換使用新的windows 11、是以才剛重灌過,除此之外,Visual Studio也取代過去的2019、而改使用新版的Visual Studio 2022(版本:17.5.4),開發專案也使用.net 6、而非習慣的.net Framework 4.5~4.7等。
是以剛開始打開專案屬性時,由於介面更換花了不少時間尋找設定所在位置,在此給大家一個建議:直接搜尋關鍵字「debug」或「url」(搜尋關鍵字Https或SSL是找不到的),而後即可在「偵錯」的區塊中找到設定「開啟 debug 啟動設定檔UI」。
Visual Studio會跳出設定視窗,可在IIS Express的設定檔中找到「使用SSL」設定,將其勾選後,「應用程式SSL URL」就會出現對應的Https網址,且該網址無法修改。
另外設定下方的「啟用匿名驗證」與「啟用Windows驗證」兩者,需勾選其中之一,若兩者皆不勾選,在啟動IIS Express進行偵錯時、Visual Studio將會跳出錯誤警告視窗。
設定完後,別忘了在啟動偵錯時選擇使用「IIS Express」,畢竟剛剛調整設定的是IIS Express的啟動設定檔。
於是我設定完成後就可以順利使用Https了嗎?錯!
也不知道是否是因為電腦才剛重灌、導致過去開發時新增的localhost憑證都不在了,所以啟用SSL後碰到的就是Https不安全的瀏覽器畫面。
舊版的Visual Studio若要啟用SSL、使用Https進行偵錯,會跳出視窗詢問是否自動新增憑證,然而不知道是否是因為我專案是Http、開發到中途才啟用SSL的原因,一開始沒有主動跳出該視窗;不過也沒關係,錯誤畫面很明顯是憑證問題,然後重新創建localhost憑證即可。
由於後續打算透過指令直接重建localhost憑證,是以重新創建憑證前,可以考慮先把舊有的憑證先行清除,包含使用者憑證:個人\憑證、受信任的根憑證授權單位\憑證,以及本機電腦憑證:個人\憑證、受信任的根憑證授權單位\憑證,若有看到localhost的憑證皆可先刪除。
※ 當然未必每個地方都有憑證,以我的當時經歷來說,就只有一個目前使用者\個人\憑證存在localhost憑證。
下方提供指令進行創建localhost憑證(須使用系統管理員的權限執行):
- 切換目錄至 IIS Express 安裝文件夾
cd “C:\Program Files (x86)\IIS Express”
- 創建憑證,記得先將指令中的url改為專案應用程式SSL URL
./IisExpressAdminCmd.exe setupsslUrl -url:https://localhost:44300/ -UseSelfSigned
追加補充:網路上也存在另一份指令,是針對IIS Express的port 44300至44399 範圍,進行重置憑證,如下:
$cert = New-SelfSignedCertificate -DnsName “localhost”, “localhost” -CertStoreLocation “cert:\LocalMachine\My” -NotAfter (Get-Date).AddYears(5)
$thumb = $cert.GetCertHashString()
For ($i=44300; $i -le 44399; $i++) {
netsh http delete sslcert ipport=0.0.0.0:$i
}
For ($i=44300; $i -le 44399; $i++) {
netsh http add sslcert ipport=0.0.0.0:$i certhash=$thumb appid=`{214124cd-d05b-4309-9af9-9caa44b2b74a`}
}
$StoreScope = ‘LocalMachine’
$StoreName = ‘root’
$Store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $StoreName, $StoreScope
$Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
$Store.Add($cert)
$Store.Close()
Reference: