OpenSSL之SSL協議的Web安全實現

我們在瞭解完PKI體系結構之後,下面我們着手利用OpenSSL來構建一個安全的基於SSL協議的Web通訊。


目標

      1,構建一個CA;

      2,Web服務器製作證書籤署請求;

      3,CA完成對Web服務器證書的簽名;

      4,實現客戶端和服務器端的雙向驗證以及兩者之間的加密通訊。


SSL協議簡介

      SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。

      SSL提供的服務: 

            1)認證用戶和服務器,確保數據發送到正確的客戶機和服務器;

            2)加密數據以防止數據中途被竊取;

            3)維護數據的完整性,確保數據在傳輸過程中不被改變。

      SSL在TCP/IP協議模型中的位置圖:

      wKiom1Oe95qjwrQOAADn3R7TFcw361.jpg

      圖解:

           SSL協議位於TCP/IP協議與各種應用層協議之間,爲數據通訊提供安全支持。SSL協議可分爲兩層:SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,爲高層協議提供數據封裝、壓縮、加密等基本功能的支持。SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。


      SSL可以實現衆多通訊協議的安全傳輸。常見的協議如下:

               http:80/tcp------------->https:443/tcp
               ftp:21/tcp----------->ftps
               smtp:25/tcp---------->smtps:465/tcp
               pop3:110/tcp--------->pops:995/tcp
               ............

      

      SSL的版本:

                SSL v2

                SSL v3

                TLS v1 (相當於SSL v3.1) IETF

                WTLS    Mobile and wireless version of the TLS protocol


      SSL通訊過程階段一圖:

      wKioL1Oe-qnR-udlAACyO3uVv6A827.jpg

      階段一圖解:

             1,Client端主動和Server端建立TCP連接;

             2,Client向Server發送Hello信息,告知Server,我想和你建立安全連接。這是我支持的SSL版本和加密算法。

             3,Server接收之後,會給Client一個響應。告知Client,我同意和你建立安全連接。我們就使用這個SSL版本和加密套件進行安全連接吧!

             4,如果Client向Server提出需要驗證Server端,那麼Server就會將自己的經過CA簽過名的數字證書文件發送給Client。Client端收到Server端發送的數字證書之後,使用CA的公鑰來驗證Server端的合法性。

                注:Server Key Exchange表示Server端沒有證書時,Server端就會把自己的公鑰發送給Client端。但是這樣沒辦法保證Server端的合法性。

             5,反過來,Server端也可以驗證Client端。這時候Server端會要求Client提供它指定CA頒發的證書。否則驗證不通過。

             6,至此,階段一結束。Client和Server端已經協商出使用的SSL版本和加解密套件等信息。而且Client端已經得到Server端的公鑰。


      SSL通訊過程階段二圖:

      wKiom1OfEkCgKpvEAADXQmYOLs4135.jpg

      階段二圖解:

                 1,如果Server端要求驗證Client端,那麼Client端此時會將自己的證書發送給Server端。

                 2,Client端會隨機產生一個Session Key,然後用Server端的公鑰加密這個Session Key併發送給Server端。

                 3,Client端使用自己的私鑰加密一些信息完成簽名,併發送給Server端。Server端使用Client端的公鑰來驗證簽名,完成對客戶端的驗證。

                 4,安全通訊開始,通訊雙方使用Session Key利用對稱加密算法加密數據並進行傳輸。接收方就可以使用Session Key進行解密。

                 5,至此,SSL安全通訊完成。


  

基於SSL的Web通訊
      1,構建CA:
                1)生成密鑰對
                (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
                     說明:CA私要保存路徑是根據openssl的配置文件來設定的
                           openssl的配置文件:/etc/pki/tls/openssl.cnf
                2)生成自簽名證書
                openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem-days 3656
                     說明:-x509 簽發X.509格式證書
                           -key  指定簽名的私鑰
                           -days 表示有效天數 3656也就是10年
                3)創建序列號文件和數據庫文件
                   touch serial index.txt
                   echo 01 > serial
                      說明:這個兩個文件的文件名也是在配置文件中定義的。
                            echo 01 > serial 表示給它一個初始序列號。          
                注:CA私鑰和自簽名證書可以同時生成:
                    openssl req -new -x509 -days 3656 -nodes -keyout /etc/pki/CA/private/cakey.pem  -out cacert.pem -subj 'CN=Test Only'
                    
                        
      2,Web服務器製作證書籤署請求:
                1)生成密鑰對
                   (umask 077;openssl genrsa -out /root/Server.key 2048)
                2)製作證書籤署請求:
                   openssl req -new -key /root/Server.key -out /root/Serreq.csr
                   注意:Common Name必須和客戶端需要訪問的FQDN或IP地址對應
                   
      3,CA完成對Web服務器證書的簽名:
                openssl ca -in Serreq.csr -out Server.crt -days 3656
                
      4,實現客戶端和服務器端的雙向驗證以及兩者之間的加密通訊:
                客戶端驗證服務器:
                           1)編輯apache主配置文件:
                              Include conf/extra/httpd-ssl.conf  #開啓ssl配置文件
                           2)編輯httpd-ssl.conf文件:
                              SSLCertificateFile "/usr/local/apache/conf/Server.crt"
                              #指定證書文件
                              SSLCertificateKeyFile "/usr/local/apache/conf/Server.key" 
                           3)啓動apache:
                              /usr/local/apache/bin/apachectl start
                           4)客戶端測試:
                              https://192.168.1.109
                              openssl s_client -connect 192.168.1.109:443
                服務器驗證客戶端:
                            ......
                              
      5,小技巧:
         如果你的CA和Web服務器是同一臺,你也可以這麼來:
                    openssl req -new -x509 -days 3656 -sha1 -nodes -newkey rsa:2048 -keyout /etc/pki/CA/private/cakey.pem  -out cacert.pem -subj '/O=Seccure/OU=Seccure Labs/CN=ww.ssldemo.com'
                      說明: -nodes 表示不用des算法對私鑰文件進行加密
                             CN:Common Name必須和客戶端需要訪問的FQDN或IP地址對應 
                             Web服務器可以之間使用cacert.pem這個證書文件
                             客戶端也可以直接使用https://www.ssldemo.com來訪問

 

OpenSSL客戶端工具
       1,openssl s_client -connect HOST:443
       
       2,ethereal 抓包工具
       
       3,ssldump  專門抓取和分析ssl協議包


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章