SSL及使用openssl實現CA

TLS如何實現各類功能?數據如何加密在網絡上傳輸?算法

 

網景(Netscape)公司在應用層和傳輸層加入了半層,把這個半層稱之爲SSL,SSL不是軟件,能夠理解是一個庫,當http交給tcp層以前先經過ssl進行封裝,因此http就成爲https,ftp變爲ftps等。SSL有三個版本V一、V二、V3,目前只有V二、V3在用。shell

因爲SSL是私有的,因此國際化組織開發出TLS(安全傳輸協議)用於在兩個通訊之間提供保密性和數據完整性。TLSv1=SSLv3數據庫

SSL協議結構

SSL協議自己能夠分爲兩層:底層爲SSL記錄協議(SSL record protocol);上層爲SSL握手協議(SSL handshake protocol)、SSL密碼變化協議(SSL change cipher spec protocol)和SSL警告協議(SSL alert protocol)。安全

image

SSL握手協議:是SSL協議很是重要的組成部分,用來協商通訊過程當中使用的加密套件(對稱加密算法、密鑰交換算法和MAC算法等)、在服務器和客戶端之間安全地交換密鑰,實現服務器和客戶端的身份驗證。客戶端和服務器經過握手協議創建一個會話。會話包含一組參數,主要有會話ID、對方的證書、加密套件(包括密鑰交換算法、數據加密算法和MAC算法)及主密鑰。服務器

SSL密碼變化協議:客戶端和服務器端經過密碼變化協議通知對端,隨後的報文都將使用新協商的加密套件和密鑰進行保護和傳輸。網絡

SSL警告協議:用來容許一方向另外一方報告告警信息。消息中包含告警的嚴重級別和描述。併發

SSL記錄協議:主要負責對上層的數據進行分塊、計算並添加MAC、加密,最後把記錄塊傳輸給對方。dom

消息傳輸過程當中使用基於密鑰的MAC(Message Authentication Code,消息驗證碼)來檢驗消息的完整性。MAC是將密鑰和任意長度的數據轉換爲固定長度數據的一種算法。利用MAC算法驗證消息完整性的過程如圖所示。發送者在密鑰的參與下,利用MAC算法計算出消息的MAC值,並將其加在消息以後發送給接收者。接收者利用一樣的密鑰和MAC算法計算出消息的MAC值,並與接收到的MAC值比較。若是兩者相同,則報文沒有改變;不然,報文在傳輸過程當中被修改,接收者將丟棄該報文。tcp

image

SSL會話創建

兩臺主機之間SSL會話是如何創建的?以http爲例,https使用443端口工具

在沒有使用SSL的時候創建三次握手後便可通訊,當使用SSL時,三次握手後,

①客戶端請求,服務端收到請求後與客戶端協商創建SSL(如:協議版本、加密算法等)

②服務器把證書發給客戶端

③客戶端獲取證書以後要驗證證書(頒發機構信任)

④客戶端生成一個會話密鑰(對稱加密密鑰)併發給服務器端

⑤服務端就可加密數據發送

SSL/TLS協議的運行原理淺析

SSL程序軟件--openssl

加密解密算法實現工具(程序)有openssl和gpg

OPENSSL:SSL的開源實現,實現了大部分算法,該軟件有三部分組成
libcrypto:通用加密庫,其餘軟件連接到庫文件便可實現功能
libssl:TLS/SSL的實現,實現了數據傳輸的三種特性的庫
openssl:命令行工具,可實現私有證書頒發機構以及加解密等功能。

openssl配置文件:/etc/pki/tls/openssl.conf 主要在實現CA時使用

查看openssl的子命令:[root@host]#openssl  ?

openssl speed [算法名] #測試算法加密速度

openssl enc #先使用whatis查看,再使用man+whatis信息查找幫助

 

使用enc子命令進行加密

openssl enc –e -des3 -salt -a -in inittab -out inittab.deb3

-e/d:e是表示加密,d是表示解密
-des3:指定加密算法
-salt:爲了和openssl0.9.5之後的版本兼,容默認設置。這是通過加密後放在密碼最前面的一段字符串,用途也是爲了讓破解更難。
-a :當進行加解密時,他只對數據進行運算,有時須要進行base64轉換,設置此選項後加密結果進行base64編碼,解密前先進行base64編碼。
-in :輸入文件,缺省爲標準輸入
-out :輸出文件,缺省爲標準輸出

使用 –d選項進行解密
openssl enc –d -des3 -d -salt -in inittab.des3 -out inittab

 

使用單向加密得到指紋

[root@host]#md5sum inittab 或者openssl dgst –md5 inittab

[root@host]#sha1sum inittab

如何給用戶生成密碼?openssl passwd -1 -salt 不使用salt選項會使用隨機salt ,-1表示md5

openssl的rsa實現:rsa子命令是RSA key processing tool,而rsautil纔是加解密工具 ,可是公鑰通常不用於加密

 

生成隨機數

rand子命令:openssl rand -base64 長度 ,生成指定長度的隨機數

隨機數的來源:收集磁盤IO的中斷時間間隔或者敲擊鍵盤的時間間隔做爲隨機數,生成的隨機數會保存在一段內存空間(熵池),當使用隨機數過量的時候,熵池沒有隨機數可用了能夠經過大量磁盤IO讓其從新生成

/dev/random 僅從熵池中取數據,沒有數據以後會阻塞

/dev/urandom 熵池沒有數據後軟件生成隨機數

 

使用openssl構建私有CA

步驟一:生成一對密鑰,生成RSA,使用子命令genrsa,生成私鑰,從私鑰提取公鑰

[root@host]#openssl genrsa #默認生成512位

[root@host]#openssl genrsa 2048 #指定生成多少位

[root@host]#openssl genrsa 2048 > server.key #保存結果

修改server.key權限爲600,私鑰十分重要應只容許屬主訪問

或者在子shell中直接生成指定權限的密鑰文件,注意祕鑰長度參數不能寫在前

[root@host]#(umask 077;openssl genrsa -out server.key 2048)

[root@host]#openssl rsa -in server1024key -pubout #從私鑰中提取公鑰

-in 指定輸入key位置文件,-pubout輸出

 

步驟二:生成自簽署證書;使用req子命令。

[root@host]#openssl req -new -x509 -key server1024.key -out server.crt -day 365

Country Name (2 letter code) [XX]:CN                       #國家名稱

State or Province Name (full name) []:Huizhou        #省份名稱

Locality Name (eg, city) [Default City]:zhongkai      #城市名稱

Organization Name (eg, company) [Default Company Ltd]:pk           #公司名稱

Organizational Unit Name (eg, section) []:IT             #組織單位

Common Name (eg, your name or your server's hostname) []:openhost        #主機名稱

Email Address []:wjluo@pk.cn                      #郵件地址

-new :新的申請

-x509:生成自簽證書,專用於CA

-key server1024.key:指定密鑰(私鑰)文件

-out server.crt:輸出保存的位置和文件名

-day 365:指定證書有效期

文本格式輸出證書信息:openssl x509 -text -in serverkey.crt

 

此時,生成了密鑰和自簽證書以後仍不能使用,要根據/etc/pki/tls/openssl.cnf配置文件的配置路徑把證書放置在對應位置

【CA_default】

dir = /etc/pki/CA            # CA的工做路徑,最好使用絕對路徑

certs = $dir/certs           # 客戶端證書保存位置

crl_dir = $dir/crl              # 證書吊銷列表保存位置

database = $dir/index.txt            # 數據庫,給哪些人發了證(索引信息)

new_certs_dir = $dir/newcerts   # 新生成證書保存位置

certificate = $dir/cacert.pem     # CA本身的證書(要按照名稱生成)

serial = $dir/serial                        # 起始序列號,發出的證書編號

crlnumber = $dir/crlnumber      # 證書撤銷列表編號

crl = $dir/crl.pem                        # 證書撤銷列表的文件是什麼

private_key = $dir/private/cakey.pem          # CA本身的私鑰

RANDFILE = $dir/private/.rand                       # 隨機數文件,會自動生成

default_days = 365                       # 證書有效期限

default_crl_days= 30                   # 證書吊銷後保留多長時間

【req_distinguished_name】   #設置默認值,生成自簽證書的時候不用交互輸入。

 

建立配置文件中存在的相關目錄文件,/etc/pki/CA

mkdir certs newcerts crl

touch index.txt

touch serial

echo 01>serial(給予起始號)

自此,CA能夠正常接受其餘客戶端申請

每一種服務都須要本身的證書,要有證書就須要公鑰,要得到公鑰就須要私鑰。

 

以httpd爲例:

一、 新建/etc/httpd/ssl/目錄,用於存放生成的文件

二、 生成httpd應用的私鑰

注意這個私鑰和CA無關,是須要簽署的服務(另外一臺主機)生成的。

[root@host]#(umask 077;openssl genrsa -out httdd.key 1024)

三、 生成httpd的申請(填申請表)

[root@host]#openssl req -new -key httpd.key -out httpd.csr

填寫完信息後最好會詢問是否須要把請求加密存放,否就輸入空密碼

四、 把請求(申請表)發送給CA

[root@host]#openssl ca -in httpd.csr -out httpd.crt -day 365

五、 當前目錄就會有新簽好的證書

六、 能夠發現serial文件序號自增1

 

吊銷證書

(一)客戶端
  一、獲取證書serial
  # openssl x509 -in /path/to/certificate_file.crt -noout -serial -subject

(二) CA
  二、根據節點提交的serial和subject信息來驗正與index.txt文件中的信息是否一致;

  三、吊銷證書
   # openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

  四、生成吊銷證書的編號(若是是第一次吊銷,生成此文件)
   # echo 00 > /etc/pki/CA/crlnumber

  五、更新證書吊銷列表
  # cd /etc/pki/CA/crl/
  # openssl ca -gencrl -out thisca.crl

  若是須要,查看crl文件的內容:  # openssl crl -in /path/to/crlfile.crl -noout -text

相關文章
相關標籤/搜索