1. 程式人生 > >程式設計師之網路安全系列(五):數字證書以及12306的證書問題

程式設計師之網路安全系列(五):數字證書以及12306的證書問題

系列目錄:

前文回顧

假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去

  1. 如何保證隔壁老王不能看到情書內容?(保密性)
  2. 如何保證隔壁老王不修改情書的內容?(完整性)
  3. 如何保證隔壁老王不冒充明明?(身份認證)
  4. 如何保證明明不能否認情書是自己寫的?(來源的不可否認)

中間人攻擊

上面幾步還是不夠的,比如王叔叔在交換祕鑰的過程中做了手腳呢?

如何做手腳?看下圖:

  1. 王叔叔自己生成一個公私鑰,和明明以及麗麗交換。
  2. 王叔叔冒充麗麗把自己的公鑰發給明明。
  3. 明明用王叔叔的公鑰對信件加密。
  4. 王叔叔用自己的私鑰解密就可以看到明明給麗麗的郵件。
  5. 王叔叔冒充明明把自己的公鑰發給麗麗。
  6. 麗麗用王叔叔的公鑰對信件加密。
  7. 王叔叔用自己的私鑰解密就可以看到麗麗給明明內容。

那麼明明如何知道王叔叔給的公鑰就是麗麗的公鑰呢?那麼就引入了數字證書

數字證書

概念介紹

那麼王叔叔要讓明明相信他給的公鑰就是麗麗的公鑰,那麼他可以開一個證明,比如找權威機構“敏捷的水”給開個介紹信,介紹信上給加個公章。那麼這裡的介紹性就是數字證書, 公章就是數字簽名, 那麼"敏捷的水"就是頒發證書的機構CA(Certificate Authority),也就是證書授權中心

CA CA 是“Certificate Authority”的縮寫,也叫“證書授權中心”。
它是負責管理和簽發證書的第三方機構,就好比例子裡面的“敏捷的水”。一般來說,CA 必須是大家都信任的、認可的。因此它必須具有足夠的權威性。只有明明和麗麗都信任的人才能來證明,對吧?

CA證書: CA 證書,就是CA頒發的證書。

證書之間的信任關係: 用一個證書來證明另一個證書是真實可信。

證書信任鏈: 證書之間的信任關係,是可以巢狀的。比如,A 信任 A1,A1 信任 A2,A2 信任 A3......,這就是證書的信任鏈。只要你信任鏈上的第一個證書,那後續的證書,都是可以信任的。

根證書(Root Certificate): 下圖,處於最頂上的樹根位置的那個證書,就是“根證書”。除了根證書,其它證書都要依靠上一級的證書來證明自己。那誰來證明“根證書”?根證書自己證明自己,這時候我們使用者就需要自己選擇是否相信某個根證書。

根證書是整個證書體系安全的根本。如果某個證書體系中,根證書不再可信了,那麼所有被根證書所信任的其它證書,也就不再可信了。  

證書內容

我們看一下亞馬遜的證書,當我們點選瀏覽器左邊綠色的鎖時,我們可以看到如下的證書。

我們挑重點的解釋一下

  • Issuer (證書的釋出機構)
    指出是什麼機構釋出的這個證書,也就是指明這個證書是哪個公司建立的(只是建立證書,不是指證書的使用者)。對於上面的這個證書來說,就是指"Symantec Corporation"這個機構。

  • Not valid before, Not valid after (證書的有效期)

  • Public key (公鑰)


這個我們在前面介紹公鑰密碼體制時介紹過,公鑰是用來對訊息進行加密的。

  • Subject (主題)

這個證書是釋出給誰的,或者說證書的所有者,一般是某個人或者某個公司名稱、機構的名稱、公司網站的網址等。

  • Signature algorithm (簽名所使用的演算法)

就是指的這個數字證書的數字簽名所使用的加密演算法,這樣就可以使用證書釋出機構的證書裡面的公鑰,根據這個演算法對指紋進行解密,指紋的加密結果就是數字簽名。

  • Thumbprint, Thumbprint algorithm (指紋以及指紋演算法)

這個是用來保證證書的完整性的,也就是說確保證書沒有被修改過,其原理就是在釋出證書時,釋出者根據指紋演算法(一個hash演算法)計算整個證書的hash值(指紋)並和證書放在一起,使用者在開啟證書時,自己也根據指紋演算法計算一下證書的hash值(指紋),如果兩者一致,就說明證書沒有被修改過,因為證書的內容被修改後,根據證書的內容計算的出的hash值(指紋)是會變化的。 注意,這個指紋會使用CA這個證書機構的私鑰用簽名演算法(Signature algorithm)加密後和證書放在一起,只有用CA的公鑰才能解開這個簽名。

證書是如何保證身份認證的

申請證書:

  1. Amazon.com 向Symantec 公司(CA) 申請證書。
  2. Symantec(CA) 生成一對公鑰A和私鑰B。
  3. Symantec(CA) 有自己的公鑰C和私鑰D。
  4. Symantec(CA) 把Issuer,公鑰A,Subject(一般是網站的域名),Valid from,Valid to等資訊以明文的形式寫到證書裡面,然後用一個指紋演算法(SHA1或者MD5
    )計算出這些數字證書內容的一個指紋(摘要),並把指紋和指紋演算法用自己的私鑰D進行加密,然後和證書的內容一起發給Amazon.com。
  5. Symantec(CA) 把私鑰B給Amazon.com.

如何使用證書

  1. 使用者訪問amazon.com 這個網站
  2. amazon.com 把證書發給使用者
  3. 瀏覽器讀取證書。
  4. 瀏覽器發現證書機構是Symantec,然後會在作業系統中受信任的釋出機構的證書中去找Symantec的證書,如果找不到,那說明證書的釋出機構是個假的,或者不是被權威機構認證的,證書可能有問題,程式會給出一個錯誤資訊。
  5. 如果在系統中找到了Symantec的證書,那麼應用程式就會從證書中取出Symantec的公鑰C,然後對amzon.com公司的證書裡面的指紋和指紋演算法用這個公鑰C進行解密,然後使用這個指紋演算法計算amazon.com證書的指紋,將這個計算的指紋與放在證書中的指紋對比,如果一致,說明amazon.com的證書肯定沒有被修改過並且證書是Symantec釋出的,證書中的公鑰肯定是amazon.com的公鑰A, 然後我們就可以用這個公鑰A和amazon.com進行通訊,因為只有amazon.com 有私鑰B, 所以只有amazon.com才能解開資訊。

注意 權威機構的證書都是內建在作業系統裡的。

由此可見,一個證書受不受信任,那就要看你要不要新增到作業系統裡,權威的認證機構的證書都內建在作業系統裡的。

另外,我們自己也可以製作自簽名的證書,但是需要別人認可你,這個在企業內部或者開發階段是可以,我們可以自己製作一個證書新增到作業系統裡。

那麼,問題來了,當你訪問https://www.12306.cn 時,你就會得到下面的結果

這是為什麼呢?

我相信你看完本文應該清楚,那是因為12306 自己給自己發了個證書,而這個證書預設是沒有被作業系統信任,

但是當我把根證書新增到作業系統後,依然是https://www.12306.cn 不行,然後我發現是證書對應的域名不對,證書對應的域名是https://kyfw.12306.cn 訪問這個域名後,雖然證書驗證通過,但是瀏覽器的鎖還是沒有變綠

為什麼呢? 看提示,是因為12306使用了一個比較弱的機密演算法(This site uses a weak security configuration (SHA-1 signatures), so your connection may not be private.),我猜他們是為了效能??

但是,就算瀏覽器位址列的鎖不能變綠,我們還得訂票不是嗎?

我覺得12306可能需要一個作業系統內建的認證機構來發一個證書,不然普通的使用者根本不知道怎麼安裝證書,如果不使用https,那麼安全性如何得到保證呢?

最後

回到開頭的例子,明明和麗麗可以找一個權威機構來發一個證書,而且自己都內建了這個權威機構的證書。當王叔叔把麗麗的證書給明明時,明明就可以知道證書是不麗麗給的,因此就可以確定證書裡的公鑰是否是麗麗的,如果可以確定是麗麗的,那麼就可以確保加密的內容只有麗麗可以解開,因為只有麗麗有對應的私鑰。

相關推薦

程式設計師網路安全系列數字證書以及12306證書問題

系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 中間人攻擊 上面

程式設計師網路安全系列為什麼要關注網路安全

系列目錄: 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 前言 大家都知道最近幾年鬧的沸

程式設計師網路安全系列動態密碼

系列目錄 前文回顧 程式設計師之網路安全系列(五):數字證書以及12306的證書問題 我們使用了數字證書,確保了對方的公鑰身份,也就是網際網路中確定了要訪問的網站就是你要訪問的網站。 但是我們如何確定要訪問這個網站的使用者就是要訪問的使用者呢? 對銀行來說需要確保“敏捷的水”登入銀行時,必須是"敏捷

程式設計師網路安全系列資料加密非對稱祕鑰

系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 但是上面的問題是明

程式設計師網路安全系列如何安全儲存使用者密碼及雜湊演算法

系列目錄: 前言 在很多網站的早期,甚至是現在仍然有一些網站,當你點選忘記密碼功能時,你的郵箱會收到一封郵件,然後裡面赫然寫著你的密碼,很多普通使用者還會覺得慶幸,總算是找回來了,殊不知,這是多麼可怕地一件事,說明了網站是“幾乎是”明文儲存你的密碼,一旦資料使用者資料洩露或者被拖庫,那麼使用者密碼將赤裸裸

程式設計師網路安全系列資料加密對稱加密演算法

系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 上一節,我們使用了Ha

java程式設計師菜鳥進階oracle基礎詳解oracle資料庫體系架構詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

程式設計師必會技能系列2git中merge和rebase比較-3

git中有兩個合併分支的方法,一個是git merge,另一個是git rebase。 一、git merge 講解 1、畫圖講解git merge 用merge合併分支時不會改變歷史(通俗的說就是commit號不會變)。在git中merge會創造一個

程式設計師 一路走來1

在程式設計師這條路上累了你就聽聽歌吧送給自己一首默默忍淚向上遊幸運不肯輕招手我要艱苦奮鬥努力不會有極限若遇失敗再重頭現實欺弄不擔憂我要跟它決鬥挺著胸對抗命運用力握實我拳頭成功不會驟然降喝采聲不想白白承受求能用心求能用功求能做好鼓手像怒海的小孤舟冷雨悽風繼續有我願那苦痛變力量默

docker系列網路通訊

1 引言 之前的幾篇docker系列部落格說的都是單個容器或者映象的操作。但容器,作為一種簡化的作業系統,又怎能不與機器或者容器相互協同工作呢,這就需要用到容器的網路功能。docker中提供了多種不同的方式實現網路通訊。 本篇就分別說說這幾種通訊方式。 2 埠公開 啟動容器時,如果不給容器設定任何的網

前端程式設計師學好算法系列陣列

前端程式設計師怎麼才能學好演算法呢?目前演算法優秀的視訊集中在c++,java,python,本人通過幾個月專心看c++的視訊掌握了演算法的基本思路,都翻譯成前端程式碼一一寫出來,從真題到思維全面提升演算法思維面對演算法面試,不畏懼 二分查詢法O(logn)尋找陣列中的最大/最小值O(N)歸併排序演算法 O(

Scala入門系列面向對象之類

important ica back ember const 就會 out 不用 spa // 定義類,包含field以及method class HelloWorld { private var name = "Leo" def sayHello() { prin

linux系列rm命令

自動 其中 以及 添加 退出 自動清理 v操作 方式 version rm是一個危險的命令,使用的時候要特別當心,尤其對於新手,否則整個系統就會毀在這個命令(比如在/(根目錄)下執行rm * -rf)。所以,我們在執行rm之前最好先確認一下在哪個目錄,到底要刪除什麽東西,操

.Net Core 商城微服務專案系列使用Polly處理服務錯誤

專案進行微服務化之後,隨之而來的問題就是服務呼叫過程中發生錯誤、超時等問題的時候我們該怎麼處理,比如因為網路的瞬時問題導致服務超時,這在我本人所在公司的專案裡是很常見的問題,當發生請求超時問題的時候,我們希望能夠自動重試,或者是在發生服務錯誤時採取一定的策略,比如限流熔斷等等。 本篇將會使用Polly處理服

Docker系列.Net Core實現k8s健康探測機制

        k8s通過liveness來探測微服務的存活性,判斷什麼時候該重啟容器實現自愈。比如訪問 Web 伺服器時顯示 500 內部錯誤,可能是系統超載,也可能是資源死鎖,此時 httpd 程序並沒有異常退出,在這種情況下重啟容器可能是最直接最有效的解決方案。

web安全系列XSS 攻擊基礎及原理

跨站指令碼攻擊(XSS)是客戶端指令碼安全的頭號大敵。本文章深入探討 XSS 攻擊原理,下一章(XSS 攻擊進階)將深入討論 XSS 進階攻擊方式。 本系列將持續更新。 XSS 簡介 XSS(Cross Site Script),全稱跨站指令碼攻擊,為了與 CSS(Cascading Style Sheet)

STM32開發筆記51STM32F4+DP83848乙太網通訊指南系列MAC+DMA配置

本章為系列指南的第五章,講述STM32F407上MAC層以及其DMA的配置。我們在第一章知識儲備章節說到,STM32F407會在168MHz主頻之外分配一定的時間釋放匯流排資料用來處理DMA,這其中就包含MAC層的DMA,複習一下STM32F4的匯流排架構圖,(圖片來自RM0090ST中文STM32

Web安全系列XSS 攻擊進階初探 XSS Payload

什麼是 XSS Payload 上一章我談到了 XSS 攻擊的幾種分類以及形成的攻擊的原理,並舉了一些淺顯的例子,接下來,我就闡述什麼叫做 XSS Payload 以及從攻擊者的角度來初探 XSS 攻擊的威力。 在黑客 XSS 攻擊成功之後,攻擊者能夠對使用者當前瀏覽的頁面植入各種惡意指令碼,通過惡意指令碼來

Web安全系列XSS 攻擊進階挖掘漏洞

前言 目前來說,XSS 的漏洞型別主要分為三類:反射型、儲存型、DOM型,在本篇文章當中會以permeate生態測試系統為例,分析網站功能,引導攻擊思路,幫助讀者能夠快速找出網站可能存在的漏洞。 反射型 XSS 挖掘 現在筆者需要進行手工XSS漏洞挖掘,在手工挖掘之前筆者需要先逛逛網站有哪些功能點,如下圖是

爬蟲入門系列正則表示式完全指南

爬蟲入門系列目錄: 正則表示式處理文字有如疾風掃秋葉,絕大部分程式語言都內建支援正則表示式,它應用在諸如表單驗證、文字提取、替換等場景。爬蟲系統更是離不開正則表示式,用好正則表示式往往能收到事半功倍的效果。 介紹正則表示式前,先來看一個問題,下面這段文字來自豆瓣的某個網頁連結,我對內容