我們在了解完PKI體系結構之后,下面我們著手利用OpenSSL來構建一個安全的基于SSL協(xié)議的Web通訊。
1,構建一個CA; 2,Web服務器制作證書簽署請求; 3,CA完成對Web服務器證書的簽名; 4,實現(xiàn)客戶端和服務器端的雙向驗證以及兩者之間的加密通訊。
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網(wǎng)絡通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。TLS與SSL在傳輸層對網(wǎng)絡連接進行加密。 SSL提供的服務: 1)認證用戶和服務器,確保數(shù)據(jù)發(fā)送到正確的客戶機和服務器; 2)加密數(shù)據(jù)以防止數(shù)據(jù)中途被竊?。?/p> 3)維護數(shù)據(jù)的完整性,確保數(shù)據(jù)在傳輸過程中不被改變。 SSL在TCP/IP協(xié)議模型中的位置圖:  圖解: SSL協(xié)議位于TCP/IP協(xié)議與各種應用層協(xié)議之間,為數(shù)據(jù)通訊提供安全支持。SSL協(xié)議可分為兩層:SSL記錄協(xié)議(SSL Record Protocol):它建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持。SSL握手協(xié)議(SSL Handshake Protocol):它建立在SSL記錄協(xié)議之上,用于在實際的數(shù)據(jù)傳輸開始前,通訊雙方進行身份認證、協(xié)商加密算法、交換加密密鑰等。
SSL可以實現(xiàn)眾多通訊協(xié)議的安全傳輸。常見的協(xié)議如下: 1 2 3 4 5 | 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發(fā)送Hello信息,告知Server,我想和你建立安全連接。這是我支持的SSL版本和加密算法。 3,Server接收之后,會給Client一個響應。告知Client,我同意和你建立安全連接。我們就使用這個SSL版本和加密套件進行安全連接吧! 4,如果Client向Server提出需要驗證Server端,那么Server就會將自己的經(jīng)過CA簽過名的數(shù)字證書文件發(fā)送給Client。Client端收到Server端發(fā)送的數(shù)字證書之后,使用CA的公鑰來驗證Server端的合法性。 注:Server Key Exchange表示Server端沒有證書時,Server端就會把自己的公鑰發(fā)送給Client端。但是這樣沒辦法保證Server端的合法性。 5,反過來,Server端也可以驗證Client端。這時候Server端會要求Client提供它指定CA頒發(fā)的證書。否則驗證不通過。 6,至此,階段一結束。Client和Server端已經(jīng)協(xié)商出使用的SSL版本和加解密套件等信息。而且Client端已經(jīng)得到Server端的公鑰。
SSL通訊過程階段二圖:  階段二圖解: 1,如果Server端要求驗證Client端,那么Client端此時會將自己的證書發(fā)送給Server端。 2,Client端會隨機產(chǎn)生一個Session Key,然后用Server端的公鑰加密這個Session Key并發(fā)送給Server端。 3,Client端使用自己的私鑰加密一些信息完成簽名,并發(fā)送給Server端。Server端使用Client端的公鑰來驗證簽名,完成對客戶端的驗證。 4,安全通訊開始,通訊雙方使用Session Key利用對稱加密算法加密數(shù)據(jù)并進行傳輸。接收方就可以使用Session Key進行解密。 5,至此,SSL安全通訊完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 1,構建CA:
1)生成密鑰對
(umask 077;openssl genrsa -out /etc/pki/CA/ private /cakey.pem 2048)
說明:CA私要保存路徑是根據(jù)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 簽發(fā)X.509格式證書
-key 指定簽名的私鑰
-days 表示有效天數(shù) 3656也就是10年
3)創(chuàng)建序列號文件和數(shù)據(jù)庫文件
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,實現(xiàn)客戶端和服務器端的雙向驗證以及兩者之間的加密通訊:
客戶端驗證服務器:
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來訪問
|
1 2 3 4 5 | 1,openssl s_client -connect HOST:443
2,ethereal 抓包工具
3,ssldump 專門抓取和分析ssl協(xié)議包
|
|