SSL 筆記

  • SSL協議:

廣泛地用於Web瀏覽器與服務器之間的身份認證和加密數據傳輸.它位於TCP/IP協議與各種應用層協議之間,爲數據通訊提供安全支持。

SSL協議可分爲兩層:

SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,爲高層協議提供數據封裝、壓縮、加密等基本功能的支持。

SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。

 

  • 任務:

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

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

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

 

  • 過程:

服務器認證階段:

1)客戶端向服務器發送一個開始信息“Hello”以便開始一個新的會話連接;

2)服務器根據客戶的信息確定是否需要生成新的主密鑰,如需要則服務器在響應客戶的“Hello”信息時將包含生成主密鑰所需的信息;

3)客戶根據收到的服務器響應信息,產生一個主密鑰,並用服務器的公開密鑰加密後傳給服務器;

4)服務器恢復該主密鑰,並返回給客戶一個用主密鑰認證的信息,以此讓客戶認證服務器。

 

用戶認證階段:經認證的服務器發送一個提問給客戶,客戶則返回(數字)簽名後的提問和其公開密鑰,從而向服務器提供認證。

 

補充:

1.密鑰交互過程:非對稱

 

2.

 

 

  • 缺點:

只能提供交易中客戶與服務器間的雙方認證,在涉及多方的電子交易中,SSL協議並不能協調各方間的安全傳輸和信任關係。爲此,就有了SET協議。

 

二、

利用openssl產生ssl證書:

OpenSSL 1.0.0生成p12、jks、crt等格式證書的命令個過程

此生成的證書可用於瀏覽器、java、tomcat、c++等。在此備忘!

 

1.創建根證私鑰

命令:

openssl genrsa -out root-key.key 1024

 

2.創建根證書請求文件

命令:

openssl req -new -out root-req.csr -key root-key.key -keyform PEM

 

3.自籤根證書

命令:

openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root-key.key -CAcreateserial -days 3650

 

4.導出p12格式根證書

命令:

openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root-key.key -out root.p12

 

5.生成root.jks文件

keytool -import -v -trustcacerts -storepass 123456 -alias root -file root-cert.cer -keystore

root.jks

 

生成客戶端文件:

1.生成客戶端key

openssl genrsa -out client-key.key 1024

2.生成客戶端請求文件

openssl req -new -out client-req.csr -key client-key.key

3.生成客戶端證書(root證書,rootkey,客戶端key,客戶端請求文件這4個生成客戶端證書)

openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer

-CAkey root-key.key -CAcreateserial -days 3650

4.生成客戶端p12格式根證書

openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12

 

客戶端jks:

keytool -import -v -trustcacerts -storepass 123456 -alias client -file client-cert.cer -keystore

client.jks

 

生成服務端文件:

1.生成服務端key

openssl genrsa -out server-key.key 1024

2.生成服務端請求文件

openssl req -new -out server-req.csr -key server-key.key

3.生成服務端證書(root證書,rootkey,客戶端key,客戶端請求文件這4個生成客戶端證書)

openssl x509 -req -in server-req.csr -out server-cert.cer -signkey server-key.key -CA root-cert.cer

-CAkey root-key.key -CAcreateserial -days 3650

4.生成服務端p12格式根證書

openssl pkcs12 -export -clcerts -in server-cert.cer -inkey server-key.key -out server.p12

服務端JKS

keytool -import -v -trustcacerts -storepass 123456 -alias server -file server-cert.cer -keystore

server.jks

 

無密碼key命令:

openssl rsa -in client-key.key -out client-key.key.unsecure

 

三、

代碼舉例

網站:

ssl原理:http://iluoxuan.iteye.com/blog/1736275

ssl編程:http://blog.csdn.net/xs574924427/article/details/17240793

 

客戶端流程:

客戶端(相對於CA)在申請證書的時候,大體上有三個步驟:

第一步:生成客戶端的密鑰,即客戶端的公私鑰對,且要保證私鑰只有客戶端自己擁有。

 

第二步:以客戶端的密鑰和客戶端自身的信息(國家、機構、域名、郵箱等)爲輸入,生成證書請求文件。其中客戶端的公鑰和客戶端信息是明文保存在證書請求文件中的,而客戶端私鑰的作用是對客戶端公鑰及客戶端信息做簽名,自身是不包含在證書請求中的。然後把證書請求文件發送給CA機構。

 

第三步:CA機構接收到客戶端的證書請求文件後,首先校驗其簽名,然後審覈客戶端的信息,最後CA機構使用自己的私鑰爲證書請求文件簽名,生成證書文件,下發給客戶端。此證書就是客戶端的身份證,來表明用戶的身份。

 

舉例說明:

至此客戶端申請證書流程結束,其中涉及到證書籤發機構CA,CA是被絕對信任的機構。如果把客戶端證書比作用戶身份證,那麼CA就是頒發身份證的機構,我們以https爲例說明證書的用處。

 

爲了數據傳輸安全,越來越多的網站啓用https。在https握手階段,服務器首先把自己的證書發送給用戶(瀏覽器),瀏覽器查看證書中的發證機構,然後在機器內置的證書中(在PC或者手機上,內置了世界上著名的CA機構的證書)查找對應CA證書,然後使用內置的證書公鑰校驗服務器的證書真僞。如果校驗失敗,瀏覽器會提示服務器證書有問題,詢問用戶是否繼續。

 

例如12306網站,它使用的自簽名的證書,所以瀏覽器會提示證書有問題,在12306的網站上有提示下載安裝根證書,其用戶就是把自己的根證書安裝到用戶機器的內置證書中,這樣瀏覽器就不會報證書錯誤。但是注意,除非特別相信某個機構,否則不要在機器上隨便導入證書,很危險。

 

  • req命令說明:

[new/x509]

當使用-new選取的時候,說明是要生成證書請求,當使用x509選項的時候,說明是要生成自簽名證書。

 

[/key/newkey/keyout]

key和newkey是互斥的,key是指定已有的密鑰文件,而newkey是指在生成證書請求或者自簽名證書的時候自動生成密鑰,然後生成的密鑰名稱有keyout參數指定。

 

當指定newkey選項時,後面指定rsa:bits說明產生rsa密鑰,位數由bits指定。指定dsa:file說明產生dsa密鑰,file是指生成dsa密鑰的參數文件(由dsaparam生成)

 

[in/out/inform/outform/keyform]

in選項指定證書請求文件,當查看證書請求內容或者生成自簽名證書的時候使用

 

out選項指定證書請求或者自簽名證書文件名,或者公鑰文件名(當使用pubkey選項時用到),以及其他一些輸出信息。

 

inform、outform、keyform分別指定了in、out、key選項指定的文件格式,默認是PEM格式。

 

[config]

參數文件,默認是/etc/ssl/openssl.cnf(ubuntu12.04),根據系統不同位置不同。該文件包含生成req時的參數,當在命令行沒有指定時,則採用該文件中的默認值。

舉例:

/*生成證書請求,證書密鑰,完成自簽名,輸入主體相關信息*/

openssl req -new -x509 -days 3650 -nodes -out server.pem -keyout server.key -out server.crt

 

  • SSL雙向認證和SSL單向認證的區別:

雙向認證 SSL 協議要求服務器和用戶雙方都有證書。

單向認證 SSL 協議不需要客戶擁有CA證書。只需將服務器端驗證客戶證書的過程去掉,以及在協商對稱密碼方案,對稱通話密鑰時,服務器發送給客戶的是沒有加過密的(這並不影響 SSL 過程的安全性)密碼方案。

 

  • TLS和SSL區別:

SSL:(Secure Socket Layer,安全套接字層),位於可靠的面向連接的網絡層協議和應用層協議之間的一種協議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性,以實現客戶端和服務器之間的安全通訊。該協議由兩層組成:SSL記錄協議和SSL握手協議。

TLS:(Transport Layer Security,傳輸層安全協議),用於兩個應用程序之間提供保密性和數據完整性。該協議由兩層組成:TLS記錄協議和TLS握手協議

 

由於HTTPS的推出受到了很多人的歡迎,在SSL更新到3.0時,IETF對SSL3.0進行了標準化,並添加了少數機制(但是幾乎和SSL3.0無差異),標準化後的IETF更名爲TLS1.0(Transport Layer Security 安全傳輸層協議),可以說TLS就是SSL的新版本3.1

 

  • 證書格式介紹:

 

  • 單向認證過程:

1.客戶端向服務端發送SSL協議版本號、加密算法種類、隨機數等信息。

2.服務端給客戶端返回SSL協議版本號、加密算法種類、隨機數等信息,同時也返回服務器端的證書,即公鑰證書

3.客戶端使用服務端返回的信息驗證服務器的合法性,包括:

 

證書是否過期

髮型服務器證書的CA是否可靠

返回的公鑰是否能正確解開返回證書中的數字簽名

服務器證書上的域名是否和服務器的實際域名相匹配

驗證通過後,將繼續進行通信,否則,終止通信

 

4.客戶端向服務端發送自己所能支持的對稱加密方案,供服務器端進行選擇

5.服務器端在客戶端提供的加密方案中選擇加密程度最高的加密方式。

6.服務器將選擇好的加密方案通過明文方式返回給客戶端

7.客戶端接收到服務端返回的加密方式後,使用該加密方式生成產生隨機碼,用作通信過程中對稱加密的密鑰,使用服務端返回的公鑰進行加密,將加密後的隨機碼發送至服務器

8. 服務器收到客戶端返回的加密信息後,使用自己的私鑰進行解密,獲取對稱加密密鑰。

在接下來的會話中,服務器和客戶端將會使用該密碼進行對稱加密,保證通信過程中信息的安全。

發佈了110 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章