升級https - 解決系統被網絡運營商植入廣告等問題

情景回顧

福建泉州的客戶反饋, 說系統使用不正常, 經常提示 “網絡錯誤”, 或者點擊某些按鈕時會進行頁面跳轉。

讓客戶試過各種“萬能”手段: 比如清緩存, 換瀏覽器, 換電腦等等,問題依然會復現。

通過QQ遠程桌面連接客戶的電腦, 使用瀏覽器的Network控制檯, 看到監控信息中莫名出現的加載內容, 如下圖所示:

01_360_network_console_by_remote_desktop

懷疑是客戶所使用的寬帶運營商存在網頁劫持和篡改行爲。

讓客戶換運營商有點不太現實。

然後, 我們將後臺管理系統升級爲支持https的方式, 成功防止了無良網絡運營商的廣告注入、以及造成的系統不可用問題。

OK,成功搞定!

其中有一些值得記錄下來的點:

  • 1、https網頁中的js和css等控制資源, 不能加載 http協議下的資源, 所以使用CDN時需要注意。
  • 2、如果需要兼容 http與https, 則資源可以通過//開頭, 如<script src="//xxx.com/xxxx.js" ...
  • 3、https網頁中的圖片,可以引用http協議的資源。
  • 4、各種http跳轉碼是運營商的最愛,比如302,404,500等等。
  • 5、GET請求也是安全的,不加密的內容只有域名、IP、端口。
  • 6、HTTPS的好處: 加密傳輸、防止劫持、冒充、篡改、信息泄露。

HTTPS, HTTP over TLS, 主要強調的就是傳輸安全。 詳細介紹請參考維基百科: HTTPS-超文本傳輸安全協議

如今各大互聯網公司都已強制全站使用HTTPS。 國內比較知名的有:

HTTPS比起HTTP有很多好處, 當然, 成本會高一些, 比如證書的價格問題。

申請證書

現在申請頂級安全提供商的HTTPS證書, 價格已下降很多, 而且針對單個域名還有免費的證書可以申請。

如今各大雲廠商都可以申請免費的HTTPS證書, 比如阿里雲, 騰訊雲等等, 一般來說需要你的域名託管在他們的平臺, 否則的話申請會比較麻煩、需要進行一些配置與驗證纔會頒發證書。

申請免費證書

比如 阿里雲免費提供的 “SSL證書”, 由 Symantec. 簽發, 每個訂單隻支持單個明細子域名, 每人最多同時持有20個免費證書。

訪問: https://www.aliyun.com/product/cas

然後購買產品時選擇具體的購買類型即可。

02_aliyun_cas_ssl

訂單確認之後, 填寫具體的域名信息, 如根域名 cncounter.com,

www與根域名可使用同一張明細子域名證書。如 https://cncounter.comhttps://www.cncounter.com;

關於 DV, OV, EV 的區別, 請參考: https://blog.csdn.net/diandianxiyu_geek/article/details/53175214

當然, 企業使用一般得購買通配符證書, 類似 *.cncounter.com 這種。

各家廠商的價格不一樣, DV型的通配符域名證書每年約2000左右, OV通配符證書一般上萬;

我們單位購買的是 GeoTrust 簽發的通配符證書、一次性多購買幾年, 算下來價格會優惠很多。

如果查看阿里雲官方網站的Https證書,可以看到有效期只有2個月,這樣能有效防止證書泄露或者被破解。當然,這需要的人力和IT運維資源也會增加。

部署SSL證書

如果使用阿里雲, 可以下載各種格式的證書, 支持 Nginx, Apache, IIS, Tomcat等等。

以 Nginx 爲例, 參考: http://www.nginx.cn/doc/optional/ssl.html

下載之後的證書文件,最好是修改爲站點相關的名稱,例如 cncounter.com.crt 等。

server {
    listen              80;
    listen              443 ssl;
    server_name         cncounter.com *.cncounter.com;
    ssl_certificate     /usr.local/www/cncounter.com.crt;
    ssl_certificate_key /usr.local/www/cncounter.key;
    ...

    proxy_set_header X-Forwarded-Proto $scheme;
}

可在Nginx中配置請求頭 proxy_set_header, 將真實的協議傳給Tomcat之類的後端服務器。

在Tomcat的配置文件server.xml中增加Valve, 請搜索RemoteIpValve, 可大致參考: https://www.oschina.net/question/12_213459

<Valve className="org.apache.catalina.valves.RemoteIpValve" 
remoteIpHeader="x-forwarded-for" proxiesHeader="x-forwarded-by" 
protocolHeader="x-forwarded-proto" />

指定 protocolHeader="x-forwarded-proto", 會將HTTP請求頭中 x-forwarded-proto 的值設置爲scheme, 這樣 request.getScheme(), request.getRequestURL() 方法就能正確獲取到客戶端真實的協議, 如 https;

當然, 這裏是因爲我們的部署結構爲: Nginx + Tomcat, Shiro攔截的時候需要讀取這一信息。

RemoteIpValve的官方文檔爲: https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html

注意: 如果Tomcat版本不一致,則 RemoteIpValve 可配置的屬性會有些差別,參考官方文檔進行配置即可。

日期: 2019年01月23日

作者: 鐵錨 - https://blog.csdn.net/renfufei

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章