1. SSL證書的驗證過程
首先服務機構向 CA 申請 SSL 證書,提供企業信息,法人聯系方式,域名等等企業信息。CA 機構驗證後,會先自己生成一個證書,可以理解為可讀的明文。(實際上是一個特定格式的數據文件,明凱但此處為了理激喊喚解做出抽象)
驗證通過,生成證書後, CA 機構會對明文證書進行Hash,得到摘要信息,並將摘要信息使用 CA 私鑰 進行加密得到數字簽名。之後將 證書明文內容+數字簽名 返回到服務機構。
當客戶端和滲李伺服器握手時,伺服器將 CA 機構生成的 證書明文內容+數字簽名 發送給客戶端。客戶端通過操作系統或者瀏覽器內置信任的CA機構找到對應CA機構的公鑰對數字簽名進行解密,然後採用同樣的摘要演算法計算SSL證書的摘要,如果自己計算的摘要與伺服器發來的摘要一致,則證書是沒有被篡改過的!
2. android 手機使用webview 白屏 ssl 不驗證證書會有什麼後果
webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (error.getPrimaryError() == SslError.SSL_DATE_INVALID // 日期不正確
|| error.getPrimaryError() == SslError.SSL_EXPIRED // 日期不正確
|| error.getPrimaryError() == SslError.SSL_INVALID // webview BUG
|| error.getPrimaryError() == SslError.SSL_UNTRUSTED) { // 根證書丟失
if (chkMySSLCNCert(error.getCertificate())) {
handler.proceed(); // 如果證書一致,忽略錯誤
}
}
}
private boolean chkMySSLCNCert(SslCertificate cert) {
byte[] MySSLCNSHA256 = { 35, 76, 110, -121, -68, -104, -12, 84, 39, 119, -55,
101, 95, -8, -90, 9, 36, -108, 5, -57, 76, -98, -19, -73, 91, -37, 18,
64, 32, -41, 0, 109 }; //證書指紋
Bundle bundle = SslCertificate.saveState(cert);
byte[] bytes = bundle.getByteArray("x509-certificate");
if (bytes != null) {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate ca = cf.generateCertificate(new ByteArrayInputSteam(bytes));
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
byte[] Key = sha256.digest(((X509Certificate) ca).getEncoded());
return Arrays.equals(key, MySSLCNSHA256);
} catch (Exception Ex) {}
}
return false;
}
}
3. Android HTTPS證書驗證的簡單方式
近期在做IP切換的HTTPS訪問時,遇到了一些問題:客戶端如何進行HTTPS的證書驗證。
其實對於一般的項目基本都是做的單向驗塵搏證,即在客戶端證書或者HOST的驗證;對於金融、銀行相關的項目才會使用的雙向驗證,客戶端與服務端之間都要對彼此進行驗證,以防止中間人進行攻擊。
本文記錄的是:客戶端實現對HOST的驗證,這樣基本滿足一般弊轎項目的需求,也不需要客戶端內置證書,引起更新時候的麻煩。
上面只是簡單的記錄驗證HOST的方式,下面的文章會讓你收獲更多。
1. 阿里移動安全:Android安全開發之安全使用HTTPS
2. 淺析HTTPS中間人攻擊與證派卜祥書校驗
3. Android官方培訓課程 : 使用HTTPS與SSL
4. android 手機訪問ssl要怎麼做客戶端認證,需要什麼樣子的證書格式,證書名稱和網站名稱不一致怎麼解決
可以參考openssl,android自帶openssl的庫,可以通過ndk調用!
5. 一文弄懂關於證書,簽名,ssl,android包簽名機制。
所有的概念都基於一個非常重要的基礎:
rsa 非對稱加密演算法 :
先感受下幾個概念
PKI。
PKI是公鑰基礎設施(Public Key Infrastructure) 包括PKI策略、軟硬體系統、證書機構CA、注冊機構RA、證書發布系統和PKI應用等。
我們關注就倆東西: PKCS 證書機構CA 。前者是定義加密演算法,簽名,證書相關的各種事情採用的協議。後者可以為我們頒發權威的證書。
PKCS :
PKCS(The Public-Key Cryptography Standards )是由美國RSA數據安全公司及其合作夥伴制定的一組公鑰密碼學標准,其中包括證書申請、證書更新、證書作廢表發布、擴展證書內容以及數字簽名、數字信封的格式等方面的一系列相關協議。RSA演算法可以做加密、解密、簽名、驗證,還有RSA的密鑰對存儲。這些都需要標准來規范,如何輸入,如何輸出,如何存儲等。
PKCS。全稱是公鑰密碼學標准, 目前共發布過 15 個標准,這些標准都是協議。總結一下 就是對加密演算法,簽名,證書協議的描述。下面列舉一些常用的協議,這些協議在本文都會對應上。
這些協議具體的實現就體現在openssl等工具中, 以及jdk工具keytool jdk java第三方庫bouncycastle。
比如用openssl 如何生成公/私鑰(PKCS#1)、簽名(PKCS#1 )、簽名請求文件(KCS#10)、 帶口令的私鑰(PKCS#8)。 含私鑰的證書(PKCS#12)、證書庫(PKCS#12)
其中涉及到演算法的基礎協議PKCS#1等,由於涉及到密碼學原理所以我們並不需要深究它,只要知道怎麼做就可以了。
現實中我們要解決這樣一種情況:
客戶端和伺服器之間的數據要進行加密。需要兩個達成同一個對稱秘鑰加密才行,那麼這個秘鑰如何生成,並在兩邊都能拿到,並保證傳輸過程中不被泄露。 這就用到非對稱加密了。 後續的傳輸,就能用這個 對稱秘鑰來加密和解密了。
還有這樣一個問題:
就是客戶端如何判斷服務端是否是合法的服務端。這就需要服務端有個id來證明它,而這個id 就是證書,而且必須是權威機構頒發的才能算是合法的。
因為客戶端即瀏覽器,認定證書合法的規則必須通過第三方來確認 即ca頒發的證書。否則就我可能進了一個假網站。
而這兩個問題 都是ssl協議要解決的內容。
所以ssl協議做了兩件事情,一是驗證身份,二是協商對稱秘鑰,並安全的傳輸。 而實現這個過程的關鍵數據模型就是證書, 通過證書中的ca對證書的簽名,實現了身份驗證,通過證書中的公鑰,實現對對稱秘鑰加密,從而實現數據保密。 其實還順手做了一件事情就是通過解密簽名比對hash,保證了數據完整性。
明白ssl協議 首先明白幾個重要的概念:
證書: 顧名思義就是提供了一種在Internet上驗證通信實體身份的方式,數字證書不是數字身份證,由權威公正的第三方機構,即CA(例如中國各地方的CA公司)中心簽發的證書, 就是可以認定是合法身份的。客戶端不需要證書。 證書是用來驗證服務端的。
一般的證書都是x509格式證書,這是一種標準的證書,可以和其他證書類型互相轉換。完整來說證書包含,證書的內容,包括 版本號, 證書序列號, hash演算法, 發行者名稱,有效期, 公鑰演算法,公鑰,簽名(證書原文以及原文hash一起簽名)而這個內容以及格式 都是標准化的,即x509格式 是一種標準的格式。
簽名: 就用私鑰對一段數據進行加密,得到的密文。 這一段數據在證書的應用上就是 對證書原文+原文hash進行簽名。
誰簽的名,就是用誰的私鑰進行加密。就像身份證一樣, 合法的身份證我們都依據是政府簽的,才不是假證, 那就是瀏覽器會有政府的公鑰,通過校驗(解密)簽名,如果能夠解密,就可以確定這個就是政府的簽名。就對了。
hash演算法 :對原始數據進行某種形式的信息提取,被提取出的信息就被稱作原始數據的消息摘要。比如,MD5和SHA-1及其大量的變體。 hash演算法具有不可逆性,無法從摘要中恢復出任何的原始消息。長度總是固定的。MD5演算法摘要的消息有128個比特位,SHA-1演算法摘要的消息最終有160比特位的輸出。
ca機構: 權威證書頒發機構,瀏覽器存有ca的公鑰,瀏覽器以此公鑰來驗證服務端證書的合法性。
證書的獲取: 生成證書申請文件.csr(涉及到PKCS#10定義的規范)後向ca機構申請。 或者自己直接通過生成私鑰就可以一步到位生成自簽名證書。 自簽名證書就是用自己的私鑰來簽名證書。
那麼為了體現到 證書身份認證、數據完整、保密性三大特性 ,證書的簡化模型可以認為包含以下兩個要素:伺服器公鑰,ca的簽名(被ca私鑰加密過的證書原文+原文hash),
身份認證:
瀏覽器存有ca公鑰,用ca公鑰解密網站發給你的證書中的簽名。如果能解密,說明該證書由ca頒發,證書合法。 否則瀏覽器就會報警告,問你是否信任這個證書,也就是這個網站。這時候的證書可以是任何人簽發的,可以自己簽發的。 但是中間人攻擊。 完全偽造新的證書, 這就沒有辦法了。 所以還是信任證書的時候要謹慎。
數據完整:
如果你信任該證書的話,這時候就會用證書中的公鑰去解密簽名,如果是ca簽發的證書,那麼之前就已經通過ca的公鑰去解密簽名了。 然後得到證書hash,然後在瀏覽器重新對證書做hash,兩者比對一致的話,說明證書數據沒有被篡改。
保密性:
使用證書的公鑰對對稱秘鑰加密保證傳輸安全,對稱秘鑰生成後,後續的傳輸會通過對稱秘鑰來在服務端和客戶端的加解密。
那麼ssl協議的具體過程就是:
4.網站接收瀏覽器發來的數據之後 使用自己的私鑰校驗簽名,並對原文進行hash 與解密出的hash 做比對檢查完整性。然後發送編碼改變通知,伺服器握手結束通知(所有內容做hash )。 發送給客戶端校驗。
5 客戶端校驗,校驗成功後,之後就用 對稱秘鑰進行通信了。
總共的過程是 c-s-c- s-c 四次握手。
四次握手簡單來說分別是:
1.請求獲取證書
2.服務端返回證書,客戶端驗證了證書的合法性和完整性,同時生成了對稱秘鑰。
3.客戶端把加密的 對稱秘鑰發給伺服器。伺服器檢查真實性和完整性。
4.服務端返回握手結束通知,客戶端再檢查一次真實性和完整性。
前兩次握手是明文, 後兩次握手是密文。 所以都要檢查身份真實性和數據完整性。
ca的作用:
ca起到一個權威中間人的角色,如果脫離了ca, 那麼證書還是證書,還能加密,保證數據完整性。 但是無法應用在客戶端去認定伺服器身份合法這個場景下。
下面就詳細說下 脫離了ca簽發的證書的應用:
自簽名證書:
證書如果沒有權威機構的簽名,就是沒有權威機構給你簽發身份證。 那麼這時候身份認證的場景變了。
這時候的認證場景就變成了,不再是某個官方權威說了算,而是假設第一次碰到這個證書,會認為,這個證書與之捆綁的實體之間是合法的並做記錄。如果當這個實體下次捆綁了另一個證書,那麼就是非法的。
這種情況常用於android中安裝和校驗app的時候,會先假設第一次安裝的是合法的應用,認定這個app證書中的公鑰是合法的公鑰。然後通過自簽名的證書,校驗簽名,就能實現後續安裝是否合法以及完整性。
android中的如何對app進行身份認定和不被篡改:
android系統在安裝app時候會進行校驗applicationId,applicationId 不同會認定為不同應用。相同應用,第二次安裝會校驗證書是否和之前app的證書相同,如果相同則兩個包很可能來自同一個身份。 如果證書不同,也就是該包被另一個身份用自己的私鑰重新簽名過,就會拒絕安裝。 然後通過公鑰來解密簽名,如果能解密,說明身份是ok的。否則拒絕安裝。比對解密簽名後的hash 與apk包內的cert.sf文件(該文件是apk內所有文件生成的hash文件)是否一致,如果相同則認定為沒有被篡改。
android在提交應用商店的問題:
應用商店也會校驗 後續的上傳和第一次上傳時的證書,以及類似上述的後續的一系列校驗。防止合法的開發者平台被盜後,上傳非法應用。
android在接入第三方sdk的問題:
接入第三方sdk 會提交applicationId 和 sha1 值。 這個sha1值就是對 證書原文的簽名後的sha1,也就是證書指紋。這個證書是證書庫里最初的那個證書(x509格式),而不是對apk簽名後生成的證書(PKCS#7)。一般的證書簽名的主體是證書原文本身,而對apk簽名還額外會對apk所有文件生成的hash值文件(cert.sf)進行一次簽名。
第三方平台會記錄 applicationId 與sha1 的對應關系。 當有假冒app試圖接入時候,由於會對app內的PKCS#7證書轉換為原始的x509格式證書,重新生成sha1值,與用戶提交sha1 比對, 如果相同則說明證書很可能是ok的。 因為sha1就是證書的指紋。 之後就會通過證書中的公鑰來校驗簽名,從而最終確認身份合法性以及信息完整性。
第三方平台之所以需要用戶去提交證書指紋sha1值,多了這一步,就意味著你的證書是可以更換的,一旦更換了證書,就必須提交新的指紋給我,然後我來做匹配。而應用商店沒有這個功能, 一旦你的證書的私鑰丟了, 那就必須重新建一個新的app。
總結來看證書的身份認定機制:
在ssl協議下,這種場景是 瀏覽器用於認定合法的伺服器身份。 在自簽名證書下,需要用戶選擇是否信任該證書。
在android app採用自簽名證書的場景下, 證書起到了 假設第一次的證書合法,公鑰合法,後續如果證書不一致或不能夠完成簽名校驗,就是非法。
證書庫:
證書庫應該滿足PKCS#12協議。 但是jdk提供了製作證書的工具keytool 可以生成keystore類型的證書庫,後綴為jks。 keystore pk12可以通過keytool命令互相轉換。
證書庫是個證書的容器, 可以用來創建數字證書。 在keystore證書庫中,所有的數字證書是以一條一條(採用別名alias區別)的形式存入證書庫的。證書庫中的證書格式為pk12,即包含私鑰。 如果導出證書的話, 可以導出為x509不包含私鑰的格式 或者pk12包含私鑰的證書。 也可以也可以用-import參數加一個證書或證書鏈到信任證書。
android中一般都採用讀取證書庫的方式,通過證書庫來創建一個證書,通過alias來區分。 所以在簽名的時候,一個alias是一個證書,不同的alias是不同的證書,不要搞錯了。
幾個關系:
證書和非對稱加密演算法的關系:
證書代表一個身份的主體,包含了非對稱秘鑰體系中的公鑰,以及用私鑰對證書簽名。這種組織結構,把非對稱加密演算法從加密的功能,拓寬到了用於身份認證,信息完整性上。這體現在了證書的作用。 本質還是利用了非對稱加密演算法的特性。
ssl協議和證書的關系。
因為證書解決了客戶端對伺服器的身份認證(自簽名證書除外),同時也解決了加密,和信息完整性,所以ssl協議基於證書來實現。
6. ssl證書的驗證過程
SSL證書最快的方式是DV驗證,只需對域的所有權認證就可以了鄭鏈,以下螞老是DV型證書的三種驗證方式,大概分為3個類型驗證,只要選擇其中一種方式就可以了:網頁喊物孫鏈接
7. Android中https單向認證的總結
我們都知道使用fiddler抓取app的數據包,不管是http還是https請求,都能輕松抓取,此時對客戶端來說,fiddler是一個服務端,對服務端來說,fiddler就變成了一個客戶端,查了下資料,這種方式稱為「中間人攻擊」,怎麼才能防止https中的「中間人攻擊」呢,工作中也用到了https,所以想深入研究一下這個問題,當然每個問題如果深挖的話,都需要很多知識的支持,所以這個過程有些地方是自己的理解,難免有些偏差,有問題,咱們討論區見。
平時我們說的單項認證,一般指的是客戶端對服務端的認證,當客戶端向服務端發送請求時,服務端會把自己的證書信息發給客戶端,這個證書信息包括服務端的公鑰、有效時間、有效地址和CA的數字簽名等信息,所以客戶端需要與預埋一個證書,這樣我們可以拿本地證書和服務端發送的證書進行信息匹配,完成認證的過程(在使用fiddler抓包時,需要事先安裝的證書就是為了完成這個客戶端對服務端的認證過程,而且這個證書應該不是正規的CA機構頒發的證書,而是fiddler自己生成的證書)。
1.獲取客戶端預埋的伺服器端的證書對象
2.生成符合x509標準的證書
3.將證書導入到本地的證書密鑰庫中去
4.使用本地密鑰庫初始化信任管理器中去
5.使用信任管理器得到X509TrustManager
6.使用X509TrustManager校驗服務端的證書,此方法不報異常即使校驗成功
GitHub,SSLHelper5.java
8. 安卓應用怎麼跳過https證書驗證
無法跳過的,目前除了安卓,蘋果也是同樣,必須HTTPS加密要求。
除非了要實現HTTPS,必須達到ATS安全,SSL證書獲取:網頁鏈接
9. 手機出現SSL怎麼解決
隨著網路安全的普及,大多數人都知道網站要森亂確保安全需要安裝SSL證書,但卻不知道手機里的應用也是需要SSL證書保護的。手機應用要確保安全的話,也需要安裝https證書,這樣才能使用戶的訪問更安全,手機應用中的數據更安全。不過,手機證書有時也會出現證書錯誤,比如Android手機SSL證書連接錯誤,下面就來看看怎樣修復這些錯亂談誤。
怎樣修復Android手機上的SSL連接錯誤?
當你在Android手機上接收到SSL證書錯誤信息提示時,如下圖所示,你需要檢查修復此SSL連接錯誤。
這里有五種方式可以幫助你解決這個問題。如果一種不行,請嘗試下一個。
1.) 更正Android設備上的日期和時間
手機SSL證書連接時,最容易出現的就是日期和時間的錯誤,解決這一問題的方法非常簡單,只要選擇「設置」並選擇「日期&時間」,進入這一界面後,激活「自動更新日期&時間」選項,在這里就可以對時間和日期進行修改了。
2.) 清除Chrome上的瀏覽數據
如果修改日期&時間這種方法無效,你可能需要清除你的瀏覽數據。這是另一種簡單的方式。首先打開Chrome,點擊"菜單"選項,然後轉到"隱私"並選擇"設置",然後選擇「清除瀏覽數據」,檢查屏幕上所有的勾選框,然後點擊「清除」。
3.) 更改WiFi連接
如果以上兩種方法都不起作用,請試著更改你的設備上的WiFi連接。如果你登錄的是公共的WiFi,則可能存在不安全的情況。所以請連接一個私有的WiFi,然後查看Android錯誤是否得到了修復。
4.) 暫時禁用殺毒軟體
如果你已經在你的Android手機上安裝了殺毒軟體或安全應用程序,請暫時禁用此類程序軟體,然後再開始瀏覽網頁。有時,嘩春碰這些殺毒app可能會干擾你的瀏覽器,使它們不能進行SSL連接。
5.) 重置你的Android設備
如果以上所述方法都不能解決SSL證書錯誤連接的問題,你還可以選擇重置你的Android設備。不過這個方法有一定風險性,為了防止你丟失存儲的東西,建議在重置設備之前備份您的手機數據,然後選擇重置工廠數據就可以解決連接問題。
10. android webservice https 怎麼進行ssl雙向驗證
1)客戶對服舉頌務器的身份認證:
SSL伺服器允許客戶的瀏覽器使用標準的公鑰正晌鄭加密技術和一些可靠的認謹襪證中心(CA)的證書,來確認伺服器的合法性。
2)伺服器對客戶的身份認證:
也可通過公鑰技術和證書進行認證,也可通過用戶名,password來認證。
3)建立伺服器與客戶之間安全的數據通道:
SSL要求客戶與伺服器之間的所有發送的數據都被發送端加密、接收端解密,同時還檢查數據的完整性。