開發(fā)隨著HTTPS的普及,很多應(yīng)用都需要HTTPS了,在實(shí)際開發(fā)中,對(duì)于HTTPS的應(yīng)用,我總結(jié)了一下一些需要注意的地方,如果不全,歡迎補(bǔ)充。
1. 訪問速度
以前大家都不采用HTTPS的原因,除了一個(gè)花錢之外,就是嫌棄速度慢了,不過隨著瀏覽器的發(fā)展,這個(gè)已經(jīng)不在是一個(gè)很大問題了。有人專門做過一個(gè)測(cè)試,見這里https://www.keycdn.com/blog/https-performance-overhead/?
2. 資源加載
在HTTPS的應(yīng)用里,如果加載了HTTP的請(qǐng)求,不同瀏覽器的行為有一些不一樣。
IE瀏覽器/FireFox/Safari/Chrome對(duì)于script之類的則直接禁止加載,同時(shí)地址欄上有個(gè)警告提示,圖片則能正常瀏覽。
360瀏覽器的兼容模式都正常,極速模式和Chrome行為一樣。

所以如果在HTTPS應(yīng)用里,所有的請(qǐng)求都應(yīng)該是HTTPS鏈接,我的建議是對(duì)于應(yīng)用內(nèi)的資源可以采用相對(duì)路徑,對(duì)于外部資源則需要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在內(nèi),不過需要注意的一點(diǎn)的是,IE7和IE8會(huì)下載2次。
可以見這里:http://stackoverflow.com/questions/6785442/browser-support-for-urls-beginning-with-double-slash
3. Cookie
同一的域名下的Cookie是可以區(qū)分開來的,默認(rèn)的是HTTP下Cookie會(huì)帶到HTTPS下,HTTPS下的Cookie是不會(huì)帶到HTTP下,如果要2者互通,需要設(shè)置Cookie的Secure標(biāo)記為false。
詳細(xì)見這里:https://en.wikipedia.org/wiki/HTTP_cookie#HttpOnly_cookie
Java的代碼如下:cookie.setSecure(false)
否則的話,你會(huì)發(fā)現(xiàn)HTTPS寫的Cookie,在其他HTTP下面讀取不到
4. 開發(fā)環(huán)境
因?yàn)椴捎肏TTPS后,就無法采用fiddler/charles等代理工具用來調(diào)試請(qǐng)求,所以最好是應(yīng)用同時(shí)能夠支持HTTP模式,這樣開發(fā)過程中采用HTTP,到了生產(chǎn)環(huán)境后就切換到HTTPS。
我的方法是Nginx + HTTP,Nginx部署HTTPS,后端應(yīng)用只采用http,這樣開發(fā)也是用HTTP,如果是HTTPS模式,則由Nginx在HTTP HEADER里設(shè)置一個(gè)變量,標(biāo)記當(dāng)前是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)站會(huì)報(bào)錯(cuò),是因?yàn)閷?duì)方HTTPS的證書(比如證書等級(jí)不夠)或者配置問題,對(duì)于確定可信的網(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());
}
如果還有其他,我想到了再補(bǔ)充。