最近工作遇到一個(gè)https鏈接夺姑,通過(guò)pc(瀏覽器,curl)能正常訪問(wèn)掌猛,ios能正常訪問(wèn)盏浙,但是在android里訪問(wèn)異常
使用DefaultHttpClient訪問(wèn)?
javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
使用AndroidHttpClient訪問(wèn)
javax.net.ssl.SSLHandshakeException: com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: Certificate not valid until Tue Jun 07 08:00:00 GMT+08:00 2016 (compared to Tue May 03 22:25:19 GMT+08:00 2016)
通過(guò)抓包發(fā)現(xiàn)
pc訪問(wèn),服務(wù)器返回了正確的證書(shū)荔茬,所以訪問(wèn)正常
抓包工具是'Wireshark 2.0.4 Intel 64.dmg’
https://www.wireshark.org/download/osx/all-versions/
android訪問(wèn)废膘,返回了錯(cuò)誤的證書(shū),所以訪問(wèn)不正常
抓包工具:tcpdump: ?http://www.androidtcpdump.com/
通過(guò)比較pc慕蔚,android與服務(wù)器的tls協(xié)議交互丐黄,
發(fā)現(xiàn)tls版本不同,pc使用tlsv1.2 android使用tls1
pc的client hello 協(xié)議中包含server_name字?jǐn)嗫嘴鴄ndroid的client hello協(xié)議中沒(méi)有
原因分析:
經(jīng)過(guò)咨詢(xún)運(yùn)維同學(xué)后灌闺,得出結(jié)論android上的httpclient沒(méi)有支持sni,sni(Server Name Indication)是個(gè)什么東西呢
這篇文件講的很清楚了http://fengchj.com/?p=2302坏瞄,各位看官可以去仔細(xì)看看菩鲜。簡(jiǎn)單講就是,同一個(gè)機(jī)器的同一個(gè)的端口上配置了兩個(gè)https站點(diǎn)惦积,需要通過(guò)server_name判斷它訪問(wèn)的是哪一個(gè)站點(diǎn),然后返回相應(yīng)的證書(shū)猛频。
解決辦法:
這篇文章寫(xiě)的很清楚狮崩,
http://blog.dev001.net/post/67082904181/android-using-sni-and-tlsv12-with-apache
簡(jiǎn)單說(shuō)就是調(diào)用setHostName方法蛛勉,添加相應(yīng)的hostname。筆者也正是通過(guò)這個(gè)方式解決的睦柴。非常有效诽凌。