1. 程式人生 > >一文弄懂關於證書的一切,ssl協議,android包簽名機制。

一文弄懂關於證書的一切,ssl協議,android包簽名機制。

所有的概念都基於一個非常重要的基礎:

rsa 非對稱加密演算法
1. 在加解密上,兩個祕鑰是對等的 任何一個可以加密,另一個可以用來解密。
2. 用openssl建立一個祕鑰,然後可用該祕鑰可以生成另一個祕鑰。 但是反過來不可以。所以建立的祕鑰叫私鑰,而根據私鑰生成的祕鑰叫公鑰。
3. 一個私鑰只能對應一個公鑰。

先感受下幾個概念

PKI。

PKI是公鑰基礎設施(Public Key Infrastructure) 包括PKI策略、軟硬體系統、證書機構CA、註冊機構RA、證書釋出系統和PKI應用等。

我們關注就倆東西: PKCS 證書機構CA 。前者是定義加密演算法,簽名,證書相關的各種事情采用的協議。後者可以為我們頒發權威的證書。

PKCS
PKCS(The Public-Key Cryptography Standards )是由美國RSA資料安全公司及其合作伙伴制定的一組公鑰密碼學標準,其中包括證書申請、證書更新、證書作廢表釋出、擴充套件證書內容以及數字簽名、數字信封的格式等方面的一系列相關協議。RSA演算法可以做加密、解密、簽名、驗證,還有RSA的金鑰對儲存。這些都需要標準來規範,如何輸入,如何輸出,如何儲存等。

PKCS。全稱是公鑰密碼學標準, 目前共釋出過 15 個標準,這些標準都是協議。總結一下 就是對加密演算法,簽名,證書協議的描述。下面列舉一些常用的協議,這些協議在本文都會對應上。

PKCS#1定義了RSA公鑰函式的基本格式標準,特別是數字簽名。它定義了數字簽名如何計算,包括待簽名資料和籤
名本身的格式;它也定義了RSA公/私鑰的語法。

PKCS#10:證書請求語法標準。證書請求包含了一個唯一識別名、公鑰和可選的一組屬性,它們一起被請求證書的實
體簽名。

PKCS#7 是一種將資料加密和簽名(正式名稱是“enveloping”)的技術標準。 它描述數字證書的語法和其他加密
訊息——尤其是,資料加密和數字簽名的方法,也包含了演算法。但PKCS#7不包含私鑰資訊。 

PKCS#8:私鑰資訊語法標準。PKCS#8定義了私鑰資訊語法和加密私鑰語法,其中私鑰加密使用了PKCS#5標準。

PKCS#12:個人資訊交換語法標準。PKCS#12定義了個人身份資訊(包括私鑰、證書、各種祕密和擴充套件欄位)的格
式。簡單來說,PKCS#12 定義了一個用於儲存私鑰和對應公鑰證書的檔案格式,並由對稱金鑰加密保護。PKCS#12
通常採用PFX,P12作為副檔名。 PKCS#12檔案可以存放多個證書,並由密碼保護。

這些協議具體的實現就體現在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進行簽名。
誰籤的名,就是用誰的私鑰進行加密。就像身份證一樣, 合法的身份證我們都依據是政府籤的,才不是假證, 那就是瀏覽器會有政府的公鑰,通過校驗(解密)簽名,如果能夠解密,就可以確定這個就是政府的簽名。就對了。

ca機構: 權威證書頒發機構,瀏覽器存有ca的公鑰,瀏覽器以此公鑰來驗證服務端證書的合法性。

證書的獲取: 生成證書申請檔案.csr(涉及到PKCS#10定義的規範)後向ca機構申請。 或者自己直接通過生成私鑰就可以一步到位生成自簽名證書。 自簽名證書就是用自己的私鑰來簽名證書。

那麼為了體現到證書身份認證、資料完整、保密性三大特性,證書的簡化模型可以認為包含以下兩個要素:伺服器公鑰,ca的簽名(被ca私鑰加密過的證書原文+原文hash),

身份認證:
瀏覽器存有ca公鑰,用ca公鑰解密網站發給你的證書中的簽名。如果能解密,說明該證書由ca頒發,證書合法。 否則瀏覽器就會報警告,問你是否信任這個證書,也就是這個網站。這時候的證書可以是任何人簽發的,可以自己簽發的。 但是中間人攻擊。 完全偽造新的證書, 這就沒有辦法了。 所以還是信任證書的時候要謹慎。

資料完整:
如果你信任該證書的話,這時候就會用證書中的公鑰去解密簽名,如果是ca簽發的證書,那麼之前就已經通過ca的公鑰去解密簽名了。 然後得到證書hash,然後在瀏覽器重新對證書做hash,兩者比對一致的話,說明證書資料沒有被篡改。

保密性:
使用證書的公鑰對對稱祕鑰加密保證傳輸安全,對稱祕鑰生成後,後續的傳輸會通過對稱祕鑰來在服務端和客戶端的加解密。

那麼ssl協議的具體過程就是:

  1. 客戶端請求建立SSL連線,將協議版本,隨機數,支援的一套加密規則,壓縮方法 發給伺服器。

  2. 伺服器收到客戶端請求後,確定協議版本如果不一致則關閉通訊。如果一致則生成隨機數,確定的加密方法,返回證書給客戶端。證書裡面包含了網站地址, 公鑰,原文hash 簽名 以及證書的頒發機構等資訊

  3. 獲得網站證書之後 瀏覽器先驗證證書的合法性,再生成一個隨機數,然後把對稱金鑰(三個隨機數通過一個金鑰匯出器生成),編碼改變通知,前面傳送的所有內容的hash值 。 用伺服器公鑰加密以上內容,傳送給伺服器。 那個hash值是用來伺服器校驗這個階段的資料完整性。

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可以通過keystore命令互相轉換。

證書庫是個證書的容器, 可以用來建立數字證書。 在keystore證書庫中,所有的數字證書是以一條一條(採用別名alias區別)的形式存入證書庫的。證書庫中的證書格式為pk12,即包含私鑰。 如果匯出證書的話, 可以匯出為x509不包含私鑰的格式 或者pk12包含私鑰的證書。 也可以也可以用-import引數加一個證書或證書鏈到信任證書。

android中一般都採用讀取證書庫的方式,通過證書庫來建立一個證書,通過alias來區分。 所以在簽名的時候,一個alias是一個證書,不同的alias是不同的證書,不要搞錯了。

幾個關係:

證書和非對稱加密演算法的關係:
證書代表一個身份的主體,包含了非對稱祕鑰體系中的公鑰,以及用私鑰對證書籤名。這種組織結構,把非對稱加密演算法從加密的功能,拓寬到了用於身份認證,資訊完整性上。這體現在了證書的作用。 本質還是利用了非對稱加密演算法的特性。

ssl協議和證書的關係。
因為證書解決了客戶端對伺服器的身份認證(自簽名證書除外),同時也解決了加密,和資訊完整性,所以ssl協議基於證書來實現。

相關推薦

關於證書一切ssl協議android簽名機制

所有的概念都基於一個非常重要的基礎: rsa 非對稱加密演算法 : 1. 在加解密上,兩個祕鑰是對等的 任何一個可以加密,另一個可以用來解密。 2. 用openssl建立一個祕鑰,然後可用該祕鑰可以生成另一個祕鑰。 但是反過來不可以。所以建立的祕鑰叫私鑰

動態規劃(DP Dynamic Programming)下樓梯國王和金礦揹包問題Dijkstra演算法

動態規劃 參考連結 漫畫演算法,什麼是動態規劃? DP 動態規劃是一種分階段求解決策問題的數學思想 題目一 問:下樓梯問題,有一座高度是10級臺階的樓梯,從下往上走,每跨一步只能向上1級或者2級臺階,請問有多少中走法。 思路 剛才這個題目,你每走一步就有兩

“分散式鎖”一直以來你的選擇依據正確嗎?

本文主要會關注的問題是“分散式鎖”的問題。 多執行緒情況下對共享資源的操作需要加鎖,避免資料被寫亂,在分散式系統中,這個問題也是存在的,此時就需要一個分散式鎖服務。 常見的分散式鎖實現一般是基於DB、Redis、Zookeeper。下面筆者會按照順序分析下這3種分散式鎖的設計與實現,想直接看分散式鎖總結的

神經網絡中的反向傳播法——BackPropagation

簡化 range get -s 數學公式 eight 可能 width 文章   最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文版的譯者在翻譯的時候會對省略的公式推

Python的面向物件程式設計這是真正的篇非常棒的教程!

  之前在網路上看了很多關於面向物件的程式設計詳解,還是不夠過癮,所以決定自己動手寫一篇。 面向物件:Object Oriented Programming,簡稱OOP,即面向物件程式設計。           &nbs

用word製作電子公章2分鐘就能搞定!

現在很多公司的檔案和合同都是必須要加蓋公章才是有效的,有些公司發行檔案上就有公章,其實他們使用word做出來的,如果我們也還學會了,以後製作公章就簡單了!下面將逐一介紹如何製作公章,快來動動你的小手指吧!   步驟一:首先【插入】--【形狀】,選擇橢圓形,然後拖動至合適大小。

“分散式鎖”

多執行緒情況下對共享資源的操作需要加鎖,避免資料被寫亂,在分散式系統中,這個問題也是存在的,此時就需要一個分散式鎖服務。常見的分散式鎖實現一般是基於DB、Redis、zookeeper。下面筆者會按照順序分析下這3種分散式鎖的設計與實現,想直接看分散式鎖總結的小夥伴可直接翻到文件末尾處。

【python】迭代器iteror(__next__)物件與可迭代iterable物件

一、定義區別 剛開始學的經常會被迭代器與可迭代物件弄混淆,下面清晰的介紹兩者的不同。 迭代器 Iterator (物件):如果一個物件同時擁有__iter__  和 __next__方法的(物件),也就是說可以被next()函式呼叫並不斷返回下一個值的物件稱為迭

深度學習目標檢測系列:YOLO演算法|附Python原始碼

在之前的文章中,介紹了計算機視覺領域中目標檢測的相關方法——RCNN系列演算法原理,以及Faster RCNN的實現。這些演算法面臨的一個問題,不是端到端的模型,幾個構件拼湊在一起組成整個檢測系統,操作起來比較複雜,本文將介紹另外一個端到端的方法——YOLO演算法,該方法操作簡便且模擬速度快,效

JDK7,8,JD9的HashMapHashTableConcurrentHashMap及他們的區別

內容和標題一樣長哦,人家寫了好久的。如無特別指明,內容對應的原始碼是jdk1.7(後面會和1.8對比) 1:hashmap簡介(如下,陣列-連結串列形式) HashMap的儲存結構       圖中,紫色部分即代表雜湊表,也稱為雜湊陣列(預設陣列大小是16,每對

神經網路中的反向傳播法——BackPropagation [Mechine Learning & Algorithm] 神經網路基礎 [Mechine Learning & Algorithm] 神經網路基礎

原文地址:https://www.cnblogs.com/charlotte77/p/5629865.html 最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文版的譯者在翻譯的時候會對省略的公式推導過

Unicode 編碼

原文連結 Unicode 編碼 ASCII碼 在學校學 C 語言的時候,瞭解到一些計算機內部的機制,知道所有的資訊最終都表示為一個二進位制的字串,每一個二進位制位有 0 和 1 兩種狀態,通過不同的排列組合,使用 0 和 1 就可以

神經網路中的反向傳播法——BackPropagation

  最近在看深度學習的東西,一開始看的吳恩達的UFLDL教程,有中文版就直接看了,後來發現有些地方總是不是很明確,又去看英文版,然後又找了些資料看,才發現,中文版的譯者在翻譯的時候會對省略的公式推導過程進行補充,但是補充的又是錯的,難怪覺得有問題。反向傳播法其實是神經網路

Nginx中的代理與反向代理、負載均衡和快取

如何實現伺服器之間的協同功能呢? 通過 Nginx 提供的反向代理和負載均衡功能,可以合理的完成業

Redis的四種模式單機、主從、哨兵、叢集

少點程式碼,多點頭髮 本文已經被GitHub收錄,歡迎大家踴躍star 和 issues。 https://github.com/midou-tech/articles 入職第一週,我被坑了 最近剛入職新公司,本來想著這剛來新公司,一般都是熟悉熟悉公司同事,看看組內工程文件,找幾個demo自己練練手。 咳

分散式場景中各種鎖的原理及使用

1. 語言層面的鎖 樂觀鎖: 原子操作中的比較並交換簡稱CAS(Compare And Swap),在sync/atomic包中,這類原子操作由名稱以CompareAndSwap為字首的若干個函式提供 func CompareAndSwapInt32(addr *int32, old, new int32

使用Jmeter來進行效能測試

該文章是基於上一次文章的 [軟體測試漫談(web測試,自動化測試,Jmeter)](https://mp.weixin.qq.com/s/YsqHLfdihVo2sJxSZQIXWg) 的續篇, 主要是詳細講解 Jmeter 的入門教程。 因為上次的文章只是簡單地講解了 Jmeter 的使用和一些概念,所以

低功耗藍芽BLE4.2 資料

BLE = BTLE = Bluetooth Low Energy (低功耗藍芽) 1. 怎樣抓取(偵聽)BLE4.2 空中資料包 (全頻道抓取:37,38,39 同時)    * 硬體:           1) 一臺BLE4.2 裝置 (如: Nordic 52832,

嬰兒腹瀉病

是多由飲食不當或腸道內、外感染所引起的一種消化道功能紊亂綜合症,多發生在2歲以下嬰兒。嬰兒餵食母乳時,正常每天大便次數會比餵食牛奶多一至二次,為黃綠色糊便;而餵食牛奶者,則為黃色成形便。腹瀉則是指糞便中水分增加,且大便成分變質而言。一般而言,腹瀉時大便的次數會增加、水分增加、大便顏色變成綠色、氣酸臭

HTML5的六大優勢HTML5這麼火是有道理的

目前最具人氣的前端開發技術框架是什麼?移動至上時代的來臨促使越來越多的開發者利用HTML 5開發移動友好型網站。HTML 5的主要優勢一直在不斷演進,旨在提供足以與原生技術相匹配的功能。 從雷軍這樣的網際網路精英人士到菜場股市大媽都深信一點:只要站在風口,豬也能夠飛起來,那麼對於IT技能領域來講