Secure Socket Layer說明

SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。最早是Netscape公司所提出,SSL的目標在於保證兩個應用間通訊的機密性和完整性以及可驗證伺服器身分

SSL目前已廣泛的應用在HTTP連線上,當以「https://」方式連上網站,如果瀏覽器的右下角有一個鑰匙,即代表該網站有支援SSL。SSL主要是運作在應用層與傳輸層間,如下圖示。

▲SSL主要是運作在應用層與傳輸層間。

主要分為兩層,上層為SSL Handshake、SSL Change Cipher spec及SSL Alert通訊協定,其主要作用如下所述:

SSL Handshake

這是SSL在傳輸之前事先用來溝通雙方(用戶端與伺服器端)所使用的加密演算法或密鑰交換演算法,或是在伺服器和用戶端之間安全地交換密鑰及雙方的身分認證等相關規則,讓雙方有所遵循。在身分認證方面,SSLHandshake可用來認證伺服器的身分。SSL Handshake的運作流程如下所述:

▲SSL Handshake的運作流程。

(1) SSL用戶端利用Client Hello訊息將本身支援的SSL版本、加密演算法、演算法等資訊發送給SSL伺服器。

(2) SSL伺服器收到Client Hello訊息並確定本次通訊採用的SSL版本和加密套件後,利用Server Hello訊息回覆給SSL用戶端。

(3) SSL伺服器將利用Certificate訊息將本身公鑰的數位憑證傳給SSL用戶端。

(4) SSL伺服器發送Server Hello Done訊息,通知SSL用戶端版本和加密套件協商結束,並開始進行密鑰交換。

(5) 當SSL用戶端驗證SSL伺服器的證書合法後,利用伺服器的證書中之公鑰加密SSL用戶端隨機生成的Premaster Secret(這是一個用在對稱加密密鑰產生中的46位元組的亂數字),並透過Client Key Exchange消息發送給SSL伺服器。

(6) SSL用戶端發送Change Cipher Spec消息,通知SSL伺服器後續報文將採用協商好的密鑰和加密套件進行加密。

(7) SSL用戶端計算已交互的握手消息的Hash值,利用協商好的密鑰和加密演算法處理Hash值,並透過Finished消息發送給SSL伺服器。SSL伺服器利用同樣的方法計算已交互的握手消息的Hash值,並與Finished消息的解密結果比較,如果兩者相同,則證明密鑰和加密套件協商成功。

(8) SSL伺服器發送Change Cipher Spec訊息,通知SSL用戶端後續傳輸將採用協商好的密鑰和加密套件進行加密。

(9) SSL伺服器計算已交互的握手消息的Hash值,利用協商好的密鑰和加密套件處理Hash值,並透過Finished消息發送給SSL用戶端。SSL用戶端利用同樣的方法計算已交互的握手消息的Hash值,並與Finished消息的解密結果比較,如果兩者相同,且MAC值驗證成功,則證明密鑰和加密套件協商成功。在SSL用戶端接收到SSL伺服器發送的Finished消息後,如果解密成功,則可以判斷SSL伺服器是數位證書的擁有者,即SSL伺服器身分驗證成功。這是因為只有擁有私鑰的SSL伺服器才能從Client Key Exchange消息中解密得到Premaster Secret,從而間接地實現了SSL用戶端對SSL伺服器的身分驗證。

SSL Change Cipher spec

用來變更雙方傳輸加解密的演算法與訊息驗證的規格,傳輸雙方可利用此協定進行溝通並設定本次傳輸所使用的協定。

SSL Alert

當傳送雙方發生錯誤時,用來傳遞通訊雙方所發生錯誤的訊息。訊息包含告警的嚴重級別和描述。

SSL Record Protocol

SSL Record Protocol主要提供訊息的完整性及機密性要求。就機密性而言,將會利用在SSL Handshake階段所得到的Key(加密金鑰)針對往來的HTTP通訊加密;至於完整性,SSL將使用MAC(Message Authentication Code)的方式來驗證訊息是否有被更動。MAC通常使用MD5演算法來確保往來的訊息並沒有被篡改。

以下簡單說明MD5演算法。MD5是使用「單向函數」來驗證訊息的完整性,單向Hash函數指的是給與一個鍵值(Key),即可透過鍵值藉由Hash函數取得唯一的雜湊值(Vale),例如F(KEY)=VALUE,如果存在兩個以上的不同鍵值可得到相同的雜湊值,即是指此Hash函數產生碰撞(Collision)。一個正常的單向函數是不能有碰撞情況的產生。

單向Hash(雜湊)定義如下所述,假設: 
明文為M 雜湊函數是H 雜湊值為h = H(M)

單向(One-way)Hash函數需符合下列的功能: 
● 對任意長度的明文輸入,須能產生固定長度的雜湊值輸出。 
● 對於任何的明文一定可產生相對應的Hash值,且可利用硬體或軟體來產生。 
● 須可從明文產生Hash值,但不能由Hash值反推而得到明文,例如h=H(“Hello!! World”) ;。假如得到Hash值E23d21341DEFA789;在任何情況下都不能由E23d21341DEFA789反推而得到「Hello!! World」的明文,這也就是單向Hash函數的特性。 
● 對於明文 M1,在計算上是無法找出另一個明文 M2 ≠ M1,使得 H(M1) = H(M2)。 也就是一個明文產生一個Hash碼;而不能兩個不同的明文產生相同的Hash碼。 
● 若H(M1) = H(M2),則M1 = M2,若H(M1)≠H(M2),則M1≠M2。亦即同一個明文產生同一個Hash碼,不同個明文產生不同的Hash碼。

接著以Linux系統為例,說明md5sum相關指令:

(1) 產生內容為hello world的「/tmp/test」檔案。 
(2) 利用「/tmp/test」檔案內容產生md5檢驗碼,稱為known。 
(3) 修改「/tmp/test」檔(僅差別一個空白字元)。 
(4) 利用修改後的「/tmp/test」檔案內容產生md5檢驗碼。

由上得知,即使檔案僅更動一個字元,利用md5演算法所產生的檢驗碼也會完全不同。藉此來驗證訊息是否有被更動。簡而言之,SSL連線約可劃分為下列四個步驟:

▲SSL連線四個步驟。

1.SSL Client端發出ClientHello給SSL伺服器端。告知伺服器端本身可實現的算法列表和其他一些需要的資訊。

2.SSL的服務器端在接收ClientHello後會回應一個ServerHello,裡面確定了這次通訊所需要的演算法,並送出伺服器本身的憑證(資訊內包含身分及公鑰)。

3.SSL Client會新增一個秘密金鑰,並利用伺服器傳來的公鑰來加密,而且會回傳加密後的秘密金鑰密文給伺服器。

4.伺服器使用自己的私鑰解開秘密金鑰密文,取得秘密金鑰後,即利用此秘密金鑰來相互通訊。

上述流程中所謂的數位憑證,採用的格式為x509,x509的架構即如下圖中金字塔般的架構:

▲x509憑證架構。

其中,Root CA(在微軟系統的IE8稱為「根憑證授權單位」,讀者可看到IE8已經預設許多根憑證授權單位)授權給CA(在微軟系統的IE8稱為「中繼憑證授權單位」),然後使用者再至認證中心註冊來取得可證明身分的憑證,x509憑證主要的欄位內容如下:

在IE8中,可利用點選功能表【工具】→【網際網路選項】,然後按下〔內容〕活頁標籤內的〔憑證〕按鈕來查看憑證內容,如下圖所示。

以電子商務應用而言,SSL可輕易達成「機密性」、「完整性」及可幫助使用者驗證伺服器的身分。因為一個完善的網站會去申請相關憑證,而在申請憑證的過程中即會驗證該伺服器的身分。

▲查看憑證內容。

這對一個支援SSL的網站而言,使用者相信資料在傳輸的過程中不會外洩及不會被更改,並且會將資料傳送到正確的網站,但對於網站經營者來說,SSL機制由於未對使用者強制認證,所以無法分辦使用者的身分。也因此出現了SET(Secure Electronic Transaction)的機制。

SET是由Master和Visa兩大信用卡組織所提出的標準,主要用來提供一個安全的線上購物環境,SET與SSL最大的差異在於使用者必須取得認證,方可在符合SET規格的商務網站上進行交易,藉此確認使用者的身分。

http://www.netadmin.com.tw/article_content.aspx?sn=1106140008

網站SSL加密原理簡介(2张图,握手有9个步骤,解释的很清楚)的更多相关文章

  1. 密码学——网间数据加密传输全流程(SSL加密原理)

    0.导言 昨天写了一篇关于<秘钥与公钥>的文章,写的比较简单好理解,有点儿像过家家,如果详细探究起来会有不少出入,今天就来详细的说明一下数据加密的原理和过程.这个原理就是大名鼎鼎SSL的加 ...

  2. SSL加密原理

    对称加密算法 对称加密算法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 非对称加密算法 非对称加密算法(RSA)是内容加密的一类算法,它有两个秘钥:公钥与私钥 ...

  3. 程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美

    悟空 种树比较好的时间是十年前,其次是现在. 自主开发了Java学习平台.PMP刷题小程序.目前主修Java.多线程.SpringBoot.SpringCloud.k8s. 本公众号不限于分享技术,也 ...

  4. PHP 7問世,2億網站效能翻倍有望

    經過10年的漫長等待,PHP 7終於正式問世了.這個影響全球8成網站的開發語言,一舉從5.0版,跳過了功敗垂成的6.0版,一舉進入了7.0時代. 20年前初夏,1995年6月8日,一位愛解決問題的C語 ...

  5. HTTPS(SSL/TLS) 原理之深入浅出

    注:本文参考自网络上的多篇HTTPS相关文章,本人根据自己的理解,进行一些修改,综合. 1. 必要的加密解密基础知识 1)对称加密算法:就是加密和解密使用同一个密钥的加密算法.因为加密方和解密方使用的 ...

  6. SSL/TLS 原理详解

    本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...

  7. 在Windows驗證網站設定部分匿名存取

    最近接連遇到幾次的需求:供內部使用的ASP.NET網站,全站使用Windows驗證,使用者以網域AD帳號登入,但網站包含少數API性質的ASHX.ASPX或MVC Action,提供其他系統呼叫整合. ...

  8. UVa Online Judge 工具網站

    UVa Online Judge 工具網站   UVa中译题uHuntAlgorithmist Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 Mirror UVa Online Judg ...

  9. SSL 通信原理及Tomcat SSL 配置

    SSL 通信原理及Tomcat SSL 双向配置 目录1 参考资料 .................................................................. ...

随机推荐

  1. modelsim将波形文件保存下来却不打开图形界面

    vsim -c -do sim.tcl -l sim.log 波形怎么保存啊,我想把波形保存下来,但不显示,想看那个信号时在加上,不然信号全部出来了太乱了 在do文件里写add wave -r *ru ...

  2. Android免坑指南(一)Sugar与SQLite

    最近在Android手机开发中使用了ORM框架Sugar1.4,节省了大量代码,同时也遇到不少麻烦,记录如下: 1. 使用group by将查询结果转换为POJO对象 在Sugar1.4中,可以使用如 ...

  3. java中数据类型及运算符的注意事项

    数据类型: boolean 类型数据只允许取值true 或 false(不可以使用0 或非0的整数来代替true和false,区分于C语言). char:Java中用" \u四位十六进制的数 ...

  4. 使用PDO连接多种数据库

    在PHP 5之前,想要连接MySQL数据库就需要使用mysql或mysqli等一系列函数来操作数据库.例如,我们使用mysql系列数据库函数进行查询操作,对应的示例代码如下: <?php //创 ...

  5. php session_id()函数介绍及代码实例

    session_id()功能: 获取设置当前回话ID. 函数说明: string session_id ([ string $id ] ) 参数: 如果指定了参数$id,那么函数会替换当前的回话id. ...

  6. C#学习笔记(3)

    先理解一下方法重写和方法重载这2个概念: 1.方法重写(override):发生在父子类之间,子类重写父类中的方法,关键字是override. 2.方法重载(overload):一个类中有多个重名的方 ...

  7. c# 串口发送接收数据

    /********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...

  8. Google Android SDK开发范例------------20141119

    一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...

  9. 常用数据与VARIANT之间的转换---从网上整理

    //头文件 1 #pragma once class VariantConvert { public: VariantConvert(void); ~VariantConvert(void); pub ...

  10. PHP问题

    /usr/bin/ld: cannot find -lltdlcollect2: ld returned 1 exit statusmake: *** [libphp5.la] 错误 1 缺少libt ...