A. android 怎麼信任https
因為最近公司的open api伺服器訪問協議換成了https,所以 android 在使用okhttp 走https 訪問的時候遇到了證書信任的問題,
在這里把我走過的彎路記下來,一如既往的話不多說,上碼:
OkHttpClient sClient = new OkHttpClient();
// 設置超時時間
sClient.setConnectTimeout(8000, TimeUnit.MILLISECONDS);
sClient.setReadTimeout(8000, TimeUnit.MILLISECONDS);
// 注冊攔截器
sClient.interceptors().add(new BaseInterceptor(context));
第一種方式:
sClient.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
運行結果:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
11-26 11:17:57.264 17106-17268/com.dooioo.addressbook W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
11-26 11:17:57.264 17106-17268/com.dooioo.addressbook W/System.err: at com.squareup.okhttp.Connection.connectTls(Connection.java:235)
11-26 11:17:57.264 17106-17268/com.dooioo.addressbook W/System.err: at com.squareup.okhttp.Connection.connectSocket(Connection.java:199)
11-26 11:17:57.264 17106-1726
B. android https驗證怎樣攜帶證書
1、生成SSL證書請求文件CSR
2、到CA機構申請SSL證書,如沃通CA等
3、在android平台部署SSL證書
4、實現https加密訪問驗證
C. android https怎麼解決
使用SSL/TLS的HTTP通信,就是不加密的通信,所有的信息明文傳播,帶來了三大風險:
竊聽風險:第三方可以獲知通信內容。
篡改風險:第三方可以修改通知內容。
冒充風險:第三方可以冒充他人身份參與通信。
SSL/TLS協議是為了解決這三大風險而設計的,希望達到:
所有信息都是加密傳輸,第三方無法竊聽。
具有校驗機制,一旦被篡改,通信
D. 請教Android端的HTTPS雙向認證問題
SSL雙向認證具體過程http://www.wosign.com/FAQ/faq2016-0216-01.htm
E. android https和http有什麼區別
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議
它是一個安全通信通道,它基於HTTP開發,用於在客戶計算機和伺服器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
它是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的安全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通信。)SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。
HTTPS和HTTP的區別:
https協議需要到ca申請證書,一般免費證書很少,需要交費。
http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議
http和https使用的是完全不同的連接方式用的埠也不一樣,前者是80,後者是443。
http的連接很簡單,是無狀態的
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全
HTTPS解決的問題:
1 . 信任主機的問題. 採用https 的server 必須從CA 申請一個用於證明伺服器用途類型的證書. 改證書只有用於對應的server 的時候,客戶度才信任次主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機. 其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,採用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過程中的數據的泄密和被竄改
1. 一般意義上的https, 就是 server 有一個證書.
a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.
b) 服務端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程.
ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當然竄改也就沒有什麼意義了.
2. 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.
a) 這里客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份.
b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體.
HTTPS 一定是繁瑣的.
a) 本來簡單的http協議,一個get一個response. 由於https 要還密鑰和確認加密演算法的需要.單握手就需要6/7 個往返.
i. 任何應用中,過多的round trip 肯定影響性能.
b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密.
i. 盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 晶元. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.
ii. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示
F. android https和http有什麼區別
https是加密的,用雙重密鑰加密。
①首先製作一個證書,保存RSA密鑰,客戶端和服務端分別保存兩份密鑰;
②然後每次請求內容時隨機生成一個AES密鑰,客戶端請求的內容和服務端返回的內容都使用這個AES密鑰加密,保證在傳輸過程中即使被黑客抓包他也看不到原文,只能看到密文;
③AES密鑰本身(一般是6位十六進制數)被第一步的RSA密鑰加密,由於Android端和伺服器端保存了rsa的公鑰和私鑰,所以可以知道本次傳輸的AES密鑰,進而解析內容;
以上就是https加密傳輸的大致過程,而http傳輸則沒有加密過程,全部明文傳輸,一旦被抓包內容也就泄露了。
G. Android 使用 HTTPS
如果你的項目的網路框架是okhttp,那麼使用https還是挺簡單的,因為okhttp默認支持HTTPS。 傳送門
Android 使用 HTTPS 配置的步驟。
配置hostnameVerifier
2.step
配置 sslSocketFactory
調用 getSslSocketFactory(null,null,null) 即可。
3.step
設置OkhttpClient。
方法 getSslSocketFactory(null,null,null) 的第一個參數 本來要傳入自簽名證書的,當傳入null 即可忽略自簽名證書。
如果你想嘗試不忽略自簽名證書 你可以調用下面的方法獲取 SSLSocketFactory。並設置到OkhttpClient中。
通過上面的幾步配置即可使用https的自簽名證書 和 單向驗證的Https了。
Glide 訪問Https的圖片
1.step
在build.gradle 引入下面的aar
2.step
設置已經驗證證書的的OkhttpClient 到Glide 既可。
END.
H. Android面試筆記——HTTP/HTTPS
HTTP和HTTPS是面試常問的問題,內容比較多而且復雜,HTTPS裡面的細節很多,本文只是把主要的東西寫出來,想要弄懂HTTPS還是要多看幾篇博文,自己動手走一遍把各個攻擊的case搞明白。
HTTP 是超⽂本傳輸協議,也就是HyperText Transfer Protocol。
Host 欄位 :客戶端發送請求時,⽤來指定伺服器的域名。 Host: www..com
Content-Length 欄位 :伺服器在返回數據時,會有 Content-Length 欄位,表明本次回應的數據長度。 Content-Length: 1000
Connection 欄位 :Connection 欄位最常用於客戶端要求伺服器使⽤ TCP 持久連接,以便其他請求復⽤。 HTTP/1.1 版本的默認連接都是持久連接,但為了兼容⽼版本的 HTTP,需要指定 Connection ⾸部欄位的值為Keep-Alive 。
Content-Type 欄位 :Content-Type 欄位⽤於伺服器回應時,告訴客戶端,本次數據是什麼格式 。 Content-Type: text/html; charset=utf-8
Content-Encoding 欄位 :Content-Encoding 欄位說明數據的壓縮⽅法。表示伺服器返回的數據使用了什麼壓縮格式 。客戶端在請求時,⽤ Accept-Encoding 欄位說明自己可以接受哪些壓縮⽅法。 Accept-Encoding: gzip, deflate
下圖為訪問網路的返回欄位
HTTP/2 協議是基於 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
這都是基於 TCP 傳輸層的問題,所以 HTTP/3 把 HTTP 下層的 TCP 協議改成了 UDP 。
UDP 發生是不管順序,也不管丟包的,所以不會出現 HTTP/1.1 的隊頭阻塞 和 HTTP/2 的⼀個丟包全部重傳問題。
UDP 是不可靠傳輸的,但基於 UDP 的 QUIC 協議 可以實現類似 TCP 的可靠性傳輸。
HTTPS 采⽤的是 對稱加密和⾮對稱加密結合 的「混合加密」⽅式:
采⽤「混合加密」的⽅式的原因:
摘要演算法⽤來實現 完整性 ,能夠為數據⽣成獨⼀⽆⼆的「指紋」,⽤於校驗數據的完整性,解決了篡改的⻛險。
客戶端在發送明⽂之前會通過摘要演算法算出明文的「指紋」,發送的時候把「指紋 + 明文」⼀同加密成密文後,發送給伺服器,伺服器解密後,用相同的摘要演算法算出發送過來的明文,通過⽐較客戶端攜帶的「指紋」和當前算出的「指紋」做⽐較,若「指紋」相同,說明數據是完整的。
客戶端先向伺服器端索要公鑰,然後⽤公鑰加密信息,伺服器收到密文後,⽤⾃⼰的私鑰解密。這就存在些問題,如何保證公鑰不被篡改和信任度?
所以這⾥就需要藉助第三⽅權威機構 CA (數字證書認證機構),將伺服器公鑰放在數字證書(由數字證書認證機構頒發)中,只要證書是可信的,公鑰就是可信的。
通過數字證書的⽅式保證伺服器公鑰的身份,解決冒充的⻛險 。
證書簽名和驗證過程 :
兩種情況 :
I. android https 支持哪些標准
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議
它是一個安全通信通道,它基於HTTP開發,用於在客戶計算機和伺服器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
它是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的安全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通信。)SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。
HTTPS和HTTP的區別:
https協議需要到ca申請證書,一般免費證書很少,需要交費。
http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議
http和https使用的是完全不同的連接方式用的埠也不一樣,前者是80,後者是443。
http的連接很簡單,是無狀態的
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全
HTTPS解決的問題:
1
. 信任主機的問題. 採用https 的server 必須從CA 申請一個用於證明伺服器用途類型的證書. 改證書只有用於對應的server
的時候,客戶度才信任次主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機.
其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,採用的證書不管自己issue
還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過程中的數據的泄密和被竄改
1. 一般意義上的https, 就是 server 有一個證書.
a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.
b) 服務端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程.
ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當然竄改也就沒有什麼意義了.
2. 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.
a) 這里客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份.
b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體.
HTTPS 一定是繁瑣的.
a) 本來簡單的http協議,一個get一個response. 由於https 要還密鑰和確認加密演算法的需要.單握手就需要6/7 個往返.
i. 任何應用中,過多的round trip 肯定影響性能.
b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密.
i. 盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 晶元. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.
ii. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示