1. 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. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示
2. 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
3. android如何調用SSl(https)加密的C#寫的webservice
0. 准備工作及環境說明
0.1 檢查JDK的環境變數是否正確(略)。我使用的是JDK 1.6
0.2 准備web伺服器,這里選用TOMCAT 6.0
0.3 准備web service服務端和客戶端(略,如果不會寫的話可以用eclipse的工具生成)。
1. 生成證書
這里用到的文件,我們存放在D:/SSL/文件夾內,其中D:/SSL/server/內的文件是要交給伺服器用的,D:/SSL/client/內的文件是要交給客戶端用的。
1.1生成服務端證書
開始-運行-CMD-在dos窗口執行下執行命令:
keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:/SSL/server/tomcat.keystore -dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" -validity 3650 -storepass zljzlj -keypass zljzlj
2.so庫保護,http://safe.ijiami.cn/使得C/C++ 層面的代碼安全也得到防護。加上資源文件保護(圖片、音頻等文件的防查看和防修改)、xml 主配文件保護(對主配文件進行二次簽名)、內存保護等措施,可以基本保證App的動態和靜態安全。
4. Android使用OkHttp請求自簽名的https網站
很多公司考慮到安全問題,項目中都採用https加密協議進行數據傳輸。但是一些公司又不想花一筆錢去CA申請證書,所以就採用自簽名的證書。
OkHttp默認是可以訪問通過CA認證的HTTPS鏈接,例如網路首頁也是https鏈接( https://www..com/ )。 但是如果是你們公司自簽名(即自己用keytool生成的證書,而不是採用通過CA認證的證書)的伺服器,OkHttp是無法訪問的,例如訪問12306網站( https://kyfw.12306.cn/otn/ ) ,會報如下錯誤:
HTTPS在傳輸數據之前需要客戶端(瀏覽器)與服務端(網站)之間進行一次握手,在握手過程中將確立雙方加密傳輸數據的密碼信息。握手過程的簡單描述如下:
握手過程中如果有任何錯誤,都會使加密連接斷開,從而阻止了隱私信息的傳輸。
以下我們使用12306網站為例
注意:別忘了加許可權和依賴okhttp庫
Demo地址: https://github.com/wildma/okhttps
參考博客: http://blog.csdn.Net/lmj623565791/article/details/48129405
5. Android之網路—第二篇(Https原理)
Android之網路—第一篇(Http原理)
Android之網路—第二篇(Https原理)
Android之網路—第三篇(解讀OkHttp)
Android之網路—第四篇(解讀Retrofit)
說的通俗一點就是身披安全衣的Http,本質還是http,只是在http外層嵌套了一個SSL/TLS的安全層,該層做了一些數據的加解密處理。
在講解Https原理之前,先做點准備工作,因為會涉及到SSL/TLS連接建立、SSL/TLS加解密方面的知識。所以會整體從網路架構和比較重要的知識點回顧下網路知識。
在講解什麼是SSL/TLS之前,回顧下TCP/IP協議的分層概念。通常一個網路的傳輸中間會經過很多的傳輸節點,才最終達到伺服器。期間過程會包含數據的拆分和拼裝、IP的解析、數據的傳輸等等操作,但是網路傳輸是很不穩定的,如果這次網路請求在中間的某一節點失敗了,難道還要重新再發送一遍么?答案是不應該這么做。
為了網路傳輸的統一規范,就設計了這么一套網路通信的規范,每一層都專注做一件事情,即使當前失敗了,也在這層做處理就可以了,盡量避免重發。
簡單解釋下,每層的含義:
通過上圖發現,數據是由上往下傳遞後,再由下往回傳遞。這是怎麼回事呢?總結就是:在 TCP / IP協議中數據先由上往下將數據裝包,然後由下往上拆包。在裝包的時候,每一層都會增加一些信息用於傳輸,這部分信息就叫報頭,當上層的數據到達本層的時候,會將數據加上本層的報頭打包在一起,繼續往下傳遞。在拆包的時候,每一層將本層需要的報頭讀取後,就將剩下的數據往上傳。
簡要分析下傳輸過程:
這里簡單總結下傳輸層的兩種連接方式:TCP和UDP
三次握手:客戶端主動打開連接,伺服器被動打開連接。
四次揮手:客戶端主動關閉,伺服器被動關閉
說個概念性的東西就是,現代密碼學分為對稱加密和非對稱加密,跟傳統密碼學不一樣的地方就是,除了可以加密文字內容外,還可以用於各種二進制數據的加解密。
通信雙方使用同一個密鑰,使用加密演算法配合上密鑰來加密,解密時使用解密演算法(加密過程的完全逆運算)配合密鑰來進行解密。常用的經典演算法:DES(56 位密鑰,密鑰太短而逐漸被棄用)、AES(128 位、192 位、256 位密鑰,現在最流行)。
通信雙方使用公鑰和加密演算法對數據進行加密得到密文;使用私鑰和加密演算法對數據進行解密得到原數據。常用的經典演算法:RSA(可用於加密和簽名)、DSA(僅用於簽名,但速度更快)。
這個有什麼用?其實這個就是後面Https加解密的原理。原理這么簡單么?是的,就這么簡單。但是要理解還得慢慢往下看。
A用自己的私鑰通過加密演算法得到的數據密文數據,這個數據就可以稱為簽過名。接收方B再用A提供的公鑰通過加密演算法就可以還原數據,從而就驗證了數據的真實性。因為只有A一個人擁有自己的私鑰。
到這里咱們就可以聊聊剛才中間人偽造數據是如何處理了。通過對稱加密可以防止中間人偷窺數據,通過數字簽名可以防止中間人篡改偽造數據。
但是完整版的簽名信息需要將簽名數據取Hash值,減少數據大小
好了,看完理解了上面的知識點,到這里我們可以慢慢分析Https是如何工作的了。
先來總結一句話:Https的本質就是在客戶端和服務端之間用非對稱加密協商出一套對稱密鑰,每次發送信息之前將內容加密,接收後解密,達到內容的加密傳輸。解釋下,就是整個數據的傳輸過程是用對稱加密的方式來傳輸的,只是密鑰的生成是由客戶端和服務端 在創建連接的時候 通過 非對稱加密的方式 協商生成的。
那這里就會有一系列的問題啦:
Q:為什麼不直接用非對稱加密的方式直接加密呢?
A:因為非對稱加密的計算過程是復雜的數學運算,太復雜了,很慢。
Q:哦哦,那既然使用對稱加密的話,這個對稱密鑰是怎麼來的?
A:在實際的場景中,服務端會對接N個客戶端,這個對稱密鑰如果都使用同一個密鑰來通信的話,肯定是不合理的,只要破解了其中一個,其他所有的都會被破解。所以整體的網路架構應該是使用不同加密方式用不同的密鑰來進行數據傳輸的。模型如下圖
Q:但是在網路場景中,對稱加密的密鑰是不能直接在網路上傳輸的。服務端和客戶端是如何都知道的呢?
A:這個是服務端和客戶端一起協商根據只有它倆知道的規則分別生成,就不用通過網路傳輸啦。
Q:如果保證它倆協商出來的密鑰不被破解呢?
A:當然是使用非對稱加密的方式啦。通過之前的加密知識,可以知道非對稱加密是目前來說是絕對安全的。而且一個私鑰可以有多個公鑰,正好滿足一個服務端對N個客戶端的場景。模型如下圖:
實際在協商通訊的過程中,這個公鑰是服務端給客戶端發送的。而且需要注意 這個公鑰是用來協商生成對稱密鑰的,不是用來做數據的加密傳輸的 。
Q:哦哦,原來是這樣,但是這樣子還是有問題啊,客戶端與服務端在協商生成密鑰的過程中為了保證數據被偷窺和被篡改的風險,一般會要求有兩套公鑰和私鑰分別做加解密和簽名驗證處理的,上面的模型只有一套公鑰和私鑰,沒法規避數據被被篡改的風險呀。
A:能提出這個問題,說明之前的學習理解得很好。從上面的模型,可以保證在協商的過程中客戶端A/B/C/D分別向伺服器傳輸的數據是安全。但是伺服器發送給客戶端的數據是如何保證的呢?換句話說就是,客戶端如何驗證數據是服務端發送過來的,而不是被中間假冒掉包的數據。這不就是之前講的數字簽名的內容么?而實際情況中,就是通過CA證書來處理這個問題的。
Q:那這個CA證書是怎麼驗證的呢?
A:請看下面的CA證書的分析。
回歸之前的分析,我們的問題點卡在了「伺服器發送給客戶端的數據是如何保證的呢」。對吧。實際上在協商通信的過程中,服務端會先給客戶端下發證書信息,這個證書信息裡面會包含非對稱加密的公鑰。但是考慮一個問題,如何保證這個公鑰就是客戶端要的公鑰呢?或者說怎麼保證這個證書就是真實的證書,而不是被篡改假冒的證書。只有驗證了這一步,客戶端才完全信賴服務端,才給伺服器發消息,也才接受伺服器的消息。這時候就只需要一套公鑰和私鑰客戶端和服務端就可以通信了。
Q:那客戶端如何驗證服務端下發的證書和公鑰是正確的呢?
A:先換個概念,將證書裡面的公鑰假設為一串數據。要驗證這個數據,只需要提供這串數據的簽名以及加密這段數據的簽名的私鑰對應的公鑰就可以了,如下圖框框所示。
Q:那這樣子又有另外的一個問題產生了怎麼去驗證 這段數據的簽名的私鑰對應的公鑰 了?
A:同樣的,也是需要提供對應的簽名和對應簽名的私鑰對應的公鑰。
Q:但是這樣子下去就會變成一個循環了,怎麼辦?
其實在這里還會有一個場景問題:第三方簽發機構不可能只給你一家公司製作證書,它也可能會給中間人這樣有壞心思的公司發放證書。這樣的,中間人就有機會對你的證書進行調包,客戶端在這種情況下是無法分辨出是接收的是你的證書,還是中間人的。因為不論中間人,還是你的證書,都能使用第三方簽發機構的公鑰進行解密。
A:是的,為處理這個問題,就需要講一個根證書的東西。先舉個例子:假設你是HR,你手上拿到候選人的學歷證書,證書上寫了持證人,頒發機構,頒發時間等等,同時證書上,還寫有一個最重要的:證書編號!我們怎麼鑒別這張證書是的真偽呢?只要拿著這個證書編號上相關機構去查,如果證書上的持證人與現實的這個候選人一致,同時證書編號也能對應上,那麼就說明這個證書是真實的。同樣的,Https請求驗證時,會用到手機操作系統內置的根證書去驗證這個證書的真偽的。
到這里就簡要分析完了證書的驗證過程。證書會包含很多信息,包括伺服器公鑰,伺服器名字,伺服器地區等等信息。這個是沒法篡改的。其中對Https連接來說最重要的就是伺服器的公鑰。
之前學習完TCP的連接過程,現在我們開始來嘮嘮Https連接。什麼是Https連接呢?准確來說就是SSL/TLS加解密層的連接。
大致的建立流程:
詳細的建立流程:
客戶端MAC secret,服務端MAC secret的主要作用:用來認證這個消息是正確的,完整的,解決對稱加密方式沒法驗證消息的缺點。
至此完整的Https在TLS層連接過程分析完畢。
如果覺得我的文章對你有幫助,請隨意贊賞。您的支持將鼓勵我繼續創作!
6. android-async-http訪問https的地址,怎麼使用
簡單來說你只需要3步, 1/ajax/services/search/images"; AsyncHttpClient client = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.put("q", "android"); params.put("rsz", "8"); client.get(url, params, new JsonHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { // Handle resulting parsed JSON response here } @Override public void onSuccess(int statusCode, Header[] headers, JSONArray response) { // Handle resulting parsed JSON response here } }); 看到了沒,返回的response已經自動轉化成JSONObject了,當然也支持JSONArray類型,override你需要的那個版本就行。 有了AsyncHttpClient,要實現這些功能是不是很簡單呢?當然這里只是很初級的介紹和使用,剩下的還需要開發者自己參考官方 文檔、源碼(官方甚至提供了一個Sample使用的集合),在實際項目中實踐。最後,強烈建議大家使用,是時候和冗長乏味的代碼說
7. 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. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示
8. android https安全嗎
HTTPS (Secure Hypertext Transfer Protocol)安全超文本傳輸協議,是一個安全通信通道,它基於HTTP開發用於在客戶計算機和伺服器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版,是使用TLS/SSL加密的HTTP協議。android相關應用使用https會比http更加安全。網頁鏈接
9. 在Android應用中使用自定義https證書,CER轉BKS
安卓配置這些需要:
1.客戶端的P12證書 :發送給服務端驗證
2.服務端的cer證書: App本地需要轉BKS證書,因為安卓只識別此證書
CER轉BKS
keytool -importcert -v -trustcacerts -alias 位置1 \
-file 位置2 \
-keystore 位置3 -storetype BKS \
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \
-providerpath 位置4 -storepass 位置5
例子
keytool -importcert -v -trustcacerts -alias xx -file E:\bks\xx.cer -keystore E:\bks\xx.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath E:\bks\bcprov-jdk15on-146.jar -storepass xxxxxx
將證書內容提取成字元串:
keytool -printcert -rfc -file xxx.cer
查看bks證書庫列表
命令:
keytool -list -rfc -keystore mytrustcerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass '123456'