security
web

網路安全(2) - HTTPS

先慶祝一下搬家

千呼萬喚 blog終於搬到自己的domain

其實搬家也不是很麻煩 就開個ec2把東西放進去 apache裝一下就有網頁了 至於Domain則是跟route53買

討論區的Disqus config改一下搞定 所以這種搬家(migration?)都是越早越好

一切準備就緒後 滿心期待打開新網頁時 發現網址上居然沒有https!!

Alt text

事實上能出現這個畫面 代表我的Web Server已經有開port 443(For https) 如果你什麼都沒做 你只是硬在網址上加上個s 是什麼都不會發生的

雖然這個只是個放static file的blog 但這根本不能忍啊

Alt text

總之是我太單純太天真 我以為只要開port 443 aws就已經全部幫我cover好了

上網找了許久 很多https認證的service(CA)都要錢 這裡要推薦一個好用的免錢認證網站 Let’s encrypt 他裡面用certbot可以讓你一鍵搞定 只要在你的ec2上wget certbot 之後run一下一切輕鬆愉快 如果你的個人網站是用AWS架的 非常推薦這個https的認證網站

破解中間人攻擊

延續上一篇 網路安全(1) - 基礎密碼學的問題 要怎麼避免神級中間人的攻擊 其實非對稱式協議唯一的bug就是一開始公鑰交換的時候可以動手腳 所以解法就是只要在互傳公鑰的時候 有一個可信的第三方可以證明說一開始你拿到的公鑰是真的就可以

就是A跟B要傳訊息之前互傳公鑰的這個步驟 A拿到B的公鑰之後 去一個有公信力的人那邊問一下 嘿 這個真的是B的公鑰嗎 他說是你就可以信 他說不是那就可能被中間人攻擊 就這麼簡單

楔子

從上一篇到這篇 花那麼多篇幅講了滿口仁義道德 這到底跟我有什麼關係 我什麼時候會需要跟別人加密傳輸講悄悄話呢??

這就是寫技術文章的最高境界 學以致用於無形之中 往上看你browser網址旁邊的精美綠色小鎖 你現在能看到這篇文章 中間發生的所有傳輸 我已經幫你加密過了

所以密碼學跟我們根本息息相關 上網就是一個最常見的應用 可是並不是每個網站都支援加密傳輸 如果那個網站的網址前是https那麼他就有加密傳輸 如果是http那就沒有

兩著的差別且聽我娓娓道來

HTTPS

要了解HTTPS就要先了解HTTP HTTP是我們要瀏覽html檔案時 web server跟browser之間用的協議 傳輸都沒經過加密

(事實上http網頁剛開始發明時 只是為了某個lab內部單純share html 根本沒有人想這麼多 但現在世代已經不一樣了 以後在任何網站輸入信用卡號前 看一下你那個網站之前是http還是https 如果是http就打死不要輸入機密資訊 這是現代最基本的網路安全知識)

隨著http普及 開始有機密的隱私資訊需要被傳輸了 就有公司提議我們來用SSL(Secure Sockets Layer)來加密原本的http協議吧 這就是https(HTTP Over SSL)的由來

原理

一樣用我們熟悉的A跟B說明 你的browser是A www.jyt0532.com這個server是B A發訊息跟B說我要看你的內容之前

  1. A把A所有支援的加密方式告訴B 再給B一個隨機數R1

  2. B從所有的加密方式中選一種 然後把B的身份訊息以證書的形式告訴A(證書裡面包含了是哪個機構給B發證書的 還有B的公鑰) 自己保留私鑰 然後給A另一個隨機數R2

  3. A拿到證書之後 就去問那個機構 嘿 這個B真的是B嗎 如果A信任這個機構 而且這個機構信任B 那A就信任B 而每個browser有每個browser信任的機構 所以也是要慎選browser啊

  4. 如果這個認證機構不可信任 或是這個機構對B的信任過期了 你的browser就會叫 誒這傢伙不是很ok 要不要連線自己負責

  5. 如果可以信任的話 A會再生成一個隨機數R3 用剛剛B給的公鑰加密變成C 把C丟給B

  6. B用私鑰對C解密得到R3

  7. A和B都有R1 R2 R3了 生成秘鑰 K = R1+R2+R3 可喜可賀 之後就可以兩邊用對稱式加密來說悄悄話了

至於為什麼不直接非對稱式用到底就好 因為對稱式的效率比非對稱式的高很多 所以只要在一開始確認身份跟確認秘鑰的時候用非對稱式就可以了

總結

所以當一個網站有了https 你有以下的保證

  1. Identity 保證你跟她對話

  2. Confidentiality 保證沒有人看到這對話

  3. Integrity 保證沒有人修改過這對話

打完收工

現在這個部落格同時支援https跟http 你現在把網址的s拿掉也是可以上 看一下你browser對於https跟http顯示的差別 以後上任何網站都要小心警覺

Google近幾年來非常推崇https 有興趣的可以看這影片Google I/O 2016(Mythbusting HTTPS: Squashing security’s urban legends) 裡面講的TLS False Start很有趣 他說如果現在A要傳給B的request不是機密的話(比如說我只是要看一下你的首頁) 那事實上A可以邊跟B握手的時候 邊送一個HTTP request 這樣B可以在A跟B的握手步驟(Step1 - 7)結束前 先process這個request 握手完之後 再用共同秘鑰加密要傳輸的內容回去 這樣基本上握手的時間就省下來了(因為server已經偷跑了)!

註: 事實上要破解中間人攻擊還有其他方式 我只提最常見的一種 是因為這種比較好接到https 有興趣可以去維基看一下怎麼破中間人攻擊