咱們在瞭解完PKI體系結構以後,下面咱們着手利用OpenSSL來構建一個安全的基於SSL協議的Web通信。php
目標 |
1,構建一個CA;node
2,Web服務器製做證書籤署請求;算法
3,CA完成對Web服務器證書的簽名;數據庫
4,實現客戶端和服務器端的雙向驗證以及二者之間的加密通信。apache
SSL協議簡介 |
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通訊提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡鏈接進行加密。安全
SSL提供的服務: 服務器
1)認證用戶和服務器,確保數據發送到正確的客戶機和服務器;網絡
2)加密數據以防止數據中途被竊取;併發
3)維護數據的完整性,確保數據在傳輸過程當中不被改變。less
SSL在TCP/IP協議模型中的位置圖:
圖解:
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通信過程階段一圖:
階段一圖解:
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通信過程階段二圖:
階段二圖解:
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協議包