SSL:Secure sockets Layer 安全套接字層,是工作於傳輸層和網絡之間,利用加密和解密技術,保障應用層各應用程序在網絡傳輸過程中安全傳輸。主要版本有V1.0, V2.0, V3.0,目前常用版本是V2.0.
SSl會話主要三步:
客戶端向服務器端索要並驗正證書;
雙方協商生成“會話密鑰”;
雙方採用“會話密鑰”進行加密通信;
其中前兩步稱爲會話握手,主要可分爲四個階段:
第一階段:ClientHello:客戶端向服務器端發送會話,內容如下:
支持的協議版本,比如tls 1.2;
客戶端生成一個隨機數,稍後用於生成“會話密鑰”;
支持的加密算法,比如AES、3DES、RSA;
支持的壓縮算法;
第二階段:ServerHello:服務端器向客戶端迴應會話,內容如下:
確認使用的加密通信協議版本,比如tls 1.2;
服務器端生成一個隨機數,稍後用於生成“會話密鑰”;
確認使用的加密方法;
發送服務器證書;
索要客戶端證書;(一般是不需要此過程的)
第三階段:客戶端收到服務器證書的操作:
驗正服務器證書,在確認無誤後取出其公鑰;(驗證過程不再詳述,可參考上篇博客。)
發送以下信息給服務器端:
一個隨機數;(用於服務器公鑰加密)
編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;
客戶端握手結束通知;
第四階段:服務器端收到客戶端發送信息的作操:
收到客戶端發來的第三個隨機數pre-master-key後,計算生成本次會話所有到的“會話密鑰”;
向客戶端發送如下信息:
編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;
服務端握手結束通知;
以上便是SSl簡單的工作原理,那麼SSL只是一種協議,他是如何具體實現這種安全機制的呢?下面我們來說一下SSL的開源實現OpenSSL。
OpenSSL,即開源實現SSL功能的工具,由三部分組成:
libencrypto加密解密庫,僅用於加密解密;
libssl庫,用於安全傳輸;
openssl多用途命令行工具;
其中libencrypto和libssl主要由開發者使用,這裏我們重點介紹openssl多用途命令行工具。
openssl由衆多的子命令,分爲三類:
標準命令;
消息摘要命令;(由dgst子命令調用)
加密命令;(由enc子命令調用)
查看當前openssl版本的命令爲:openssl version
常用的標準命令有:enc(加密)、ca(建立私有CA)、req(申請證書)、genrsa(生成rsa算法密鑰對)、rand(生成隨機數)、dgst(單向加密)...
下面我們就來使用openssl工具手動加密:
對稱加密:
工具:openssl enc
支持算法有:3des,aes,blowfish....
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in file -out file
-e:表示加密;
-des3:表示加密算法爲3des,也可以使用別的加密算法;
-a:以base64編碼格式顯示,默認爲二進制格式;
-salt:表示“加鹽”;
-in:表示要加密的文件;
-out:表示加密後的文件;
例如:用3des加密算法給/etc/fstab文件加密,加密密碼爲mageedu:
加密後可查看加密後的文件
解密:~]# openssl enc -d -des3 -a -salt -in file -out file
-d:表示是解密;
例如:將上面加密碼了的文件解密:
單向加密:
工具:openssl dgst, md5sum, sha1sum, sha224sum, ...
dgst命令:
~]# openssl dgst -md5 /PATH/TO/SOMEFILE
-md5:表示MD5算法;也可以使用其它算法;
例如:對fstab文件用MD5算法做單向加密,取其特徵碼:
也可以便用md5sum命令對其做單向加密,取其特徵碼:
對比發現,特徵碼是一樣的,只是顯示方式不一樣。
生成用戶密碼:
工具:openssl passwd,passwd
openssl passwd -1(MD5) -salt SALT
-1:表示MD5算法;目前只支持MD5算法;
SALT:表示隨機數,可以手動自己加,也可以使用命令獲取;
例如:獲取mageedu加密後的密碼:
發現隨機數一點的變化,會造成密碼很大的變化;
生成隨機數:
工具:openssl rand
~]# openssl rand [-hex|-base64] NUM
-hex:表示以十六進制格式顯示;
-base64:表示以base64編碼格式顯示;
NUM:表示隨機數字節數;
例如:生成一個10字節的隨機數,以十六進制格式顯示;
相同命令發現,隨機數隨機生成的,每個都不一樣。
公鑰加密:
生成私鑰: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)
由於私鑰保密性比較重要,所以私鑰只允許屬主有讀寫權限,所以用umask 077,生成的私鑰權限將自動
生成爲600的權限。
genrsa子命令:表示生成rsa算法的密鑰對;
-out:表示私鑰生成後保存的路徑;
NUM_BITS:表示生成私鑰的位數;
例如:生成一個1024位的私鑰,保存爲/tmp/mykey
生成1024位私鑰,且權限爲600;
提出公鑰: ~]#openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -out /PATH/TO/PRIVATE_KEY_FILE -pubout
rsa:表示爲rsa算法;
-in:表示私鑰位置;
-out:表示提取公鑰後存放位置;
-pubout:表示提取公鑰;
例如:從上面的私鑰中提取對應公鑰,保存爲/tmp/pubkey:
以上介紹了使用openssl工具各種算法手動加密的過程,接下來將介紹如何使用openssl工具來建立私有CA。
CA:有公共CA和私有CA,公共CA有專門機構來負責管理,這裏我們只介紹小範圍內的私有CA。
建立私有CA有兩種工具:openssl和OpenCA,openssl在小範圍內使用,OpenCA一般在企業內使用,此處我們
只介紹小範圍內的私有CA的創建,使用openssl工具:
在創建私有CA前我們先CA的配置文件:/etc/pki/tls/openssl.cnf內包含CA的一些常用路徑:
CA工作目錄:/etc/pki/CA
頒發證書存放目錄:/etc/pki/CA/certs
吊銷證書存放目錄:/etc/pki/CA/crl
新頒發證書存放目錄:/etc/pki/CA/newcerts
頒發證書索引存放文件:/etc/pki/CA/index.txt
頒發證書序列號存放文件:/etc/pki/CA/serial
吊銷證書序列號存放文件:/etc/pki/CA/crlnumber
CA自己私鑰存放文件:/etc/pki/CA/private/cakey.pem
CA自簽證書存放文件:/etc/pki/CA/cacert.pem
那麼構建私有CA就是在確定配置爲CA的服務器上生成一個自簽證書,併爲CA提供所需要的目錄及文件即可;
工具:openssl req
步驟:
(1)生成私鑰;
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
注意:私鑰存放位置必須爲/etc/pki/CA/private/且名稱必須是cakey.pem這是在配置文件中規定的。
(2)生成自簽證書;
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out
/etc/pki/CA/cacert.pem -days 3655
-new:生成新證書籤署請求;
-x509:生成自籤格式證書,專用於創建私有CA時;
-key:生成請求時用到的私有文件路徑;
-out:生成的請求文件路徑;如果自籤操作將直接生成簽署過的證書;
-days:證書的有效時長,單位是day;
自籤時會填寫相應私有CA的一些信息;
(3)爲CA提供所需的目錄及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
創建certs,crl,newcerts這三個目錄文件,已存在的話無需創建;
~]# touch /etc/pki/CA/{serial,index.txt}
創建證書序列號和證書索引文件serial,index.txt;
~]# echo 01 > /etc/pki/CA/serial
第一次創建證書時,需將證書序列號輸入到serial文件中;
要用到證書進行安全通信的服務器,需要向CA請求籤署證書:
步驟:以httpd爲例:
(1)用到證書的主機生成私鑰;
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
(2)生成證書籤署請求;
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days365
申請時填寫的信息要能和CA自簽證書中信息要能對應;
(3)將請求通過可靠方式發送給CA主機;
~]#scp httpd.csr root@ipadd:/PATH/FILE
由於此處實驗是在同一網內,可用這種方式,實際可用多種方式,只要確保請求信息能安全到CA主機
在CA主機中查看確定是否收到:
(4)在CA主機上籤署證書;
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
(5)將簽署好的證書發給申請主機:
~]#scp /etc/pki/CA/certs/httpd.crt root@ipadd:/PATH
此處同樣使用scp命令,不再多說。
可在申請證書的主機上查看是否收到簽署的證書:
至此,申請簽署證書已經完成,可以使用簽署的證書。注意:申請完成後,需要在申請主機和CA主機上把申請信息刪除,保證安全。此處不再演示。
如果自己私鑰丟失,需要向CA申請吊銷證書:
步驟:
(1)客戶端獲取要吊銷的證書的serial(在使用證書的主機執行);
獲取吊銷證書方法:
~]# openssl x509 -in /PATH(證書路徑) -noout -serial -subject
(2)CA主機吊銷證書:
先根據客戶提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致;
吊銷:# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
(3)生成吊銷證書的吊銷編號(第一次吊銷證書時執行)
# echo 01 > /etc/pki/CA/crlnumber
(4)更新證書吊銷列表:
# openssl ca -gencrl -out thisca.crl
也可以查看crl文件:# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
至此,吊銷證書已完成,不過在實驗情況下,一般不會用到吊銷證書,大家只需瞭解就行。
那麼現在SSl和OpenSSL以及建立私有CA都已經跟大家介紹完成,可能其中有些不合理的地方,希望大家相互學習相互指教,謝謝!