開發(fā)隨著HTTPS的普及捌归,很多應用都需要HTTPS了甚侣,在實際開發(fā)中星压,對于HTTPS的應用剖毯,我總結了一下一些需要注意的地方柳爽,如果不全涮雷,歡迎補充更哄。
1. 訪問速度
以前大家都不采用HTTPS的原因疚鲤,除了一個花錢之外掂咒,就是嫌棄速度慢了才沧,不過隨著瀏覽器的發(fā)展,這個已經(jīng)不在是一個很大問題了绍刮。有人專門做過一個測試温圆,見這里https://www.keycdn.com/blog/https-performance-overhead/?
2. 資源加載
在HTTPS的應用里,如果加載了HTTP的請求孩革,不同瀏覽器的行為有一些不一樣岁歉。
IE瀏覽器/FireFox/Safari/Chrome對于script之類的則直接禁止加載,同時地址欄上有個警告提示膝蜈,圖片則能正常瀏覽锅移。
360瀏覽器的兼容模式都正常熔掺,極速模式和Chrome行為一樣。
所以如果在HTTPS應用里非剃,所有的請求都應該是HTTPS鏈接置逻,我的建議是對于應用內的資源可以采用相對路徑,對于外部資源則需要HTTPS备绽。
比如好的做法是采用//地址方法券坞,這樣如果是HTTP模式,則加載HTTP資源肺素,HTTPS則加載HTTPS 資源恨锚。
HTML里的資源類似這種寫法:
HTML: <img src="http://cdn.domain.com/logo.png" />
CSS:.class { background: url(//cdn.domain.com/logo.png); }
這并不是什么新鮮玩意,只要符合RFC 1808 Section 4,RFC 2396 Section 5.2,RFC 3986 Section 5.2規(guī)范的瀏覽都支持這種模式倍靡,包括IE7和IE8在內猴伶,不過需要注意的一點的是,IE7和IE8會下載2次菌瘫。
可以見這里:http://stackoverflow.com/questions/6785442/browser-support-for-urls-beginning-with-double-slash
3. Cookie
同一的域名下的Cookie是可以區(qū)分開來的蜗顽,默認的是HTTP下Cookie會帶到HTTPS下布卡,HTTPS下的Cookie是不會帶到HTTP下雨让,如果要2者互通,需要設置Cookie的Secure標記為false忿等。
詳細見這里:https://en.wikipedia.org/wiki/HTTP_cookie#HttpOnly_cookie
Java的代碼如下:cookie.setSecure(false)
否則的話栖忠,你會發(fā)現(xiàn)HTTPS寫的Cookie,在其他HTTP下面讀取不到
4. 開發(fā)環(huán)境
因為采用HTTPS后贸街,就無法采用fiddler/charles等代理工具用來調試請求庵寞,所以最好是應用同時能夠支持HTTP模式,這樣開發(fā)過程中采用HTTP薛匪,到了生產(chǎn)環(huán)境后就切換到HTTPS捐川。
我的方法是Nginx + HTTP,Nginx部署HTTPS逸尖,后端應用只采用http古沥,這樣開發(fā)也是用HTTP,如果是HTTPS模式娇跟,則由Nginx在HTTP HEADER里設置一個變量岩齿,標記當前是HTTPS模式。
location / {
? ?proxy_passhttp://127.0.0.1:8080;
? ? proxy_set_header Host $host;
? ? proxy_set_headerX-HTTP-SECURE TRUE;
? ? ?proxy_set_header X-Real-IP$remote_addr;
? ? proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
}
這樣苞俘,開發(fā)就不需要部署HTTPS證書了盹沈,只是在HTTP模式下開發(fā)。
5. Java
Java里訪問有些HTTPS網(wǎng)站會報錯吃谣,是因為對方HTTPS的證書(比如證書等級不夠)或者配置問題乞封,對于確定可信的網(wǎng)站做裙,可以繞過HTTPS證書。
private static voidtrustAllHttpsCertificates()throwsException ? ?{
javax.net.ssl.TrustManager[]trustAllCerts=newjavax.net.ssl.TrustManager[1];
javax.net.ssl.TrustManagertm=newmiTM();
trustAllCerts[0] =tm;
javax.net.ssl.SSLContextsc= javax.net.ssl.SSLContext.getInstance("SSL");
sc.init(null,trustAllCerts,null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
如果還有其他歌亲,我想到了再補充菇用。