在.NET程式透過WebRequest來建立HTTPS或FTPS連線時,有時攻城獅可能因為無法確認憑證有效性,寫了不理會憑證是否有效的程式碼來讓程式正常運作,上線前,送到源碼檢測健康檢查時,就會被列出來*標示Critical的風險,來還技術債吧。
建立HTTPS或FTPS連線時
--HTTPS
HttpWebRequest WebRequest = (HttpWebRequest) System.Net.WebRequest.Create("https://www.MyHomeWebSite.com");
--FTPS
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://192.168.1.1:21/FileFolder");
加上這句
System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
又或者是
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate (Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
};
總之就是只想回傳true,但完全沒驗證,留下了技術債。
Insecure SSL: Server Identity Verification Disabled
好!如果這樣寫,交付客戶程式碼時,fortify會回報 Critical等級的Insecure SSL: Server Identity Verification Disabled的issue。
解決方式
修改的方式只要加上檢核,不管檢核的好或不好,像是檢核憑證發行者issuer不可以是鋼鐵人(誤,應該是東尼・史塔克)、效期、Subject是否包含domain網址等等..
ServicePointManager.ServerCertificateValidationCallback = CertificateCheck;
private static bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
…
return !certificate.Issuer.Equals("Iron Man");
}
重新送進來掃描,又是向critical issue說聲再見的時候了!(揮手,舞台下降..)
小結
- 如果網路環境是internet或是vpn連線上來的,還是應該適當的驗證憑證,確保憑證有效性!
- 不過,內網環境(intranet)若能啟用secure 連線的web、ftp site更佳。
- 每個專案的CI應該要加上客戶指定的源碼檢測檢查(廠牌,Rulepack,l,filter)。
西班牙小組賽第一場,碰上皇馬羅老闆,手心手背都是肉,只好踢和了,羅老闆上演hat-trick。
參考
Insecure SSL: Server Identity Verification Disabled