一、現象描述
使用https協議訪問某個地址時,瀏覽器會出現如下的風險提示:
以及這樣的提示: NET::ERR_CERT_AUTHORITY_INVALID
二、出現原因
瀏覽器與伺服器(訪問的網址)互動時,SSL證照驗證失敗:
- 1、SSL證照不是由受信任的CA機構頒發的
a)伺服器本身沒有加密證照 b)使用者電腦找不到對應的證照
- 2、證照過期
- 3、訪問的網站域名與證照繫結的域名不一致
三、解決方案(本文不會介紹如何製作證照)
第一種)購買商業證照,由CA機構頒發,使用證照繫結的域名訪問網站。
第二種)自己按照規範要求製作一套證照檔案:
閘道器證照 cert.pfx
發行者證照:ca.cer
使用者電腦安裝ca.cer證照; cert.pfx和ca.cer證照需要上傳到伺服器
額外補充:
如果是get請求直接訪問網站,會出現不受信的提示,點選隱藏按鈕,可以繼續訪問,代表這個瀏覽器把此網站標記為受信網站 ,則不會每次出現提示。 注意位址列上顯示的依舊是不可信。
如果是採用的ajax請求,是沒有機會點選這個隱藏按鈕的,所以一定需要證照。
四、許多疑問
證照包含什麼?
SSL證照是由數字證照頒發機構(CA)經過一系列的嚴格稽核而簽發的,包含如下資訊:
1)位址列:安全鎖、https標誌、企業名稱(僅EV型別證照)。
示例:擴充套件驗證EV SSL證照在瀏覽器的顯示效果
2)常規:證照的使用者、頒發者和有效,如下圖
3)詳細資訊:證照版本、序列號、簽名演算法、加密演算法、公鑰、有效期及使用者的詳細資訊(如省市、企業名等),如下圖
證照如何申請?
SSL證照可以向CA機構透過付費的方式申請,也可以自己製作。
證照與域名的關係?
一個證照一般只繫結一個域名,CA機構也提供申請萬用字元域名(例如,*.runoob.com),萬用字元域名相當於繫結了主域名下的所有域名,因此使用起來非常方便,但是價格也超級昂貴,幾乎只有企業才可以申請。
瀏覽器如何驗證證照?
在瀏覽器的選單中,找到並點選“Internet選項”,選擇“內容”標籤,點選“證照”按鈕,然後就可以看到瀏覽器已經信任了許多“中級證照頒發機構”和“受信任的根證照頒發機構”。當我們在訪問該網站時,瀏覽器就會自動下載該網站的SSL證照,並對證照的安全性進行檢查。
瀏覽器需要驗證SSL證照的5個方面:
第一,驗證瀏覽器中“受信任的根證照頒發機構”是否存在頒發該SSL證照的機構。
第二,檢查證照有沒有被證照頒發機構吊銷。
第三,驗證該網站的SSL證照是否過期。
第四,稽核該SSL證照的網站的域名是否與證照中的域名一致。
第五,該網站有沒有被列入欺詐網站黑名單。
根證照是最關鍵的一個證照,如果根證照不受信任,它下面頒發的所有證照都不受信任。
電腦上的證照在哪裡?
作業系統在安裝過程中會預設安裝一些受信任的CA機構的根證照,可以在”執行”裡面執行”certmgr.msc”啟動證照管理器,如下圖所示:
五、簡單科普
HTTPS協議
a)超文字傳輸安全協議(Hypertext Transfer Protocol Secure,常稱為HTTP over TLS,HTTP over SSL或HTTP Secure)是一種網路安全傳輸協議。
b)經由超文字傳輸協議(HTTP)進行通訊,但利用SSL/TLS來加密資料包。預設埠443。
SSL是什麼?
SSL是一箇中間層協議,介於傳輸層和應用層之間,屬於Socket層的實現,與應用層協議無關,可以透明的建立在應用層協議之上。
SSL是一個分層協議,由記錄層和握手層組成。其中,握手層包含SSL握手協議,SSL修改密碼規範協議,SSL告警協議,記錄層包括SSL記錄協議。
SSL握手協議
SSL握手協議建立在SSL記錄協議之上,用於在實際的資料傳輸開始前通訊雙方進行身份認證,加密演算法協商,加密金鑰交換等
握手協議由一系列在客戶和伺服器間交換的報文組成。每個報文由型別,長度,內容三部分組成
1.型別(1位元組),指SSL握手協議報文型別
2.位元組(3位元組),以位元組為單位的報文長度
3.內容。使用報文有關的內容引數
SSL協議的握手過程
1.客戶端向伺服器傳送問候訊息,該訊息包含SSL版本號,隨機數,會話ID,密碼套件,壓縮方法等資訊
- 隨機數。一個用於生成主金鑰的32位元組隨機數
- 會話ID。客戶端在此次連線中想使用的會話識別符號
- 密碼套件。每個密碼套件以SSL開頭,用WITH分割金鑰交換演算法,加密演算法,雜湊演算法
2.伺服器向客戶端返回問候訊息
3.伺服器將自己的證照附在問候訊息之後,使客戶端能用伺服器證照中的公鑰認證伺服器
4.金鑰交換方法有6種:無,RSA,匿名Diffle-hellman,固定Diffle-hellman和Fortezza。如果階段一協商的交換演算法為Fortezza,則伺服器需要向客戶端傳送一條伺服器金鑰交換訊息。
5.如果伺服器要求驗證客戶端,則向客戶端傳送一個客戶證照請求
6.伺服器傳送問候結束訊息,並等待客戶端響應
7.客戶端利用伺服器響應訊息認證伺服器的真實身份,如果伺服器要求認證客戶端,客戶端就對雙方都已知且在握手過程中的唯一一段資料進行簽名,然後把簽名後的資料連同自己的證照傳送給伺服器。
8.客戶端金鑰交換階段,客戶端根據互動得到的所有資訊生成會話預備主金鑰pre_master_sercet,並用伺服器的公鑰加密後傳送給伺服器
9.客戶端利用pre_master_sercet生成主金鑰master_sercet,然後利用主金鑰生成會話金鑰session_sercet,客戶端向伺服器傳送一條修改密碼規範訊息,通知伺服器以後從客戶端來的訊息將用session_sercet加密
10.客戶端向伺服器傳送握手結束訊息,表明握手過程中客戶端部分已經完成
11.服務端利用私鑰解密pre_master_sercet,利用相同的方式生成主金鑰master_sercet,再生成會話金鑰session_sercet,通知客戶端以後從服務端來的訊息將用session_sercet加密
12.服務端向客戶端傳送握手結束訊息,表明握手過程中服務端部分已經完成
這裡服務端與客戶端互相傳送加密的握手訊息並驗證,目的是為了保證雙方都獲得了一致的密碼,並且可以正常加密解密資料,為後續真正資料的傳輸做一次測試。
另外,HTTPS一般使用的加密與HASH演算法如下:
- 非對稱加密演算法:RSA,DSA/DSS
- 對稱加密演算法:AES,RC4,3DES
- HASH演算法:MD5,SHA1,SHA256
本作品採用《CC 協議》,轉載必須註明作者和本文連結