SSL(Secure Socket Layer,安全套接字層)是為網絡通信提供安全保障和數據完整性的一種安全協議,由Netscape公司研發。SSL協議位于網絡的應用層和傳輸層之間,它接受來自上層網絡應用層協議(如http、ftp)的數據報文,并將其再一次進行封裝、加密,再傳遞給下層網絡傳輸層協議(如tcp、udp)。該協議提供的服務主要有:
a、數據來源可靠性:一次網絡連接中的客戶端和服務器都會被驗證是否是對方所期望連接的主機。確保數據將被正確地發送至客戶端和服務器。
b、數據機密性:數據在發送之前被加密,保證其在網絡傳輸過程中,不會被竊取。
c、數據完整性:數據在接收之后,接收端主機會根據數據的特征碼以驗證數據的完整性,保證其在網絡傳輸過程中,不會被篡改。
就SSL提供的以上服務中,以數據來源可靠性最為重要。SSL采用非對稱加密算法(如RSA)來保證網絡中互聯雙方的真實性。互聯雙方各擁有一對密鑰,公私鑰。其中公鑰是公開的,網絡中的任何人都可以得到任何主機或用戶的公鑰,而唯獨私鑰是保密的。且公鑰是從其對應私鑰中提取出來的。對于公鑰加密的文件,僅能通過其對應的私鑰解密,由此便保證了數據的機密性。對于私鑰加密的文件,僅能通過其對應的公鑰解密,由此便保證了數據來源的可靠性。
openssl便是SSL的一個開源實現。本文后續內容將簡要介紹如何用openssl進行加解密、提取數據特征碼、生成密鑰,以及生成數字證書請求、創建私有CA和簽發數字證書。
1、利用openssl進行加解密
openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] ...
-ciphername指定加密算法,例如:-base64
-in filename指定要加密的文件,filename為該文件的文件名
-out filename指定將加密后的數據保存到filename指定的文件中
-e指定為加密過程,此為默認過程
-d指定為解密過程
示例:
# openssl enc -base64 -in plaintext.txt -out ciphertext.txt
采用base64加密算法將plaintext.txt文件中的數據加密,并保存到ciphertext.txt文件中。
# openssl enc -base64 -in ciphertext.txt -d
采用base64算法解密ciphertext.txt文件中的數據,并打印到顯示屏幕。
2、利用openssl提取數據特征碼
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [file...] ...
-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1指定提取數據特征碼的單向加密算法
-c指定特征碼輸出格式,每兩位跟上一個冒號
file指定要提取數據特征碼的文件
示例:
# openssl dgst -md5 -c plaintext.txt
采用md5單項加密算法提取plaintext.txt文件的數據特征碼。即使是當文件中的數據遭到微小的篡改,再次計算得出的數據特征碼都會和原先的特征碼大相徑庭。
3、利用openssl生成密鑰
openssl genrsa [-out filename] [numbits] ...
-out filename指定將生成的私鑰保存到filename文件中
numbits指定私鑰的長度(位數)
openssl rsa [-in filename] [-out filename] [-pubout] ...
-in filename指定私鑰文件
-out filename指定將從私鑰中提取出的公鑰保存到filename文件中
-pubout指定從私鑰中提取公鑰
示例:
# (umask 077; openssl genrsa -out private.key 512)
括號中的命令將在子shell中運行。第一條命令改變子shell中的umask值,令生成的文件除屬主外,其他人對他無任何權限,保證了私鑰的機密性。采用RSA非對稱加密算法生成512位的私鑰,并將其保存到private.key文件中。
# openssl rsa -in private.key -pubout
從private.key中的私鑰中提取出公鑰,并打印到顯示屏幕。
4、利用openssl生成數字證書請求
openssl req [-in filename] [-out filename] [-text] [-pubkey] [-new] [-newkey rss:bits] [-nodes] [-key filename] [-keyout filename] [-config filename] [-x509] [-days n] [-batch] ...
-in filename從指定文件中讀取數字證書請求
-out filename將生成的數字證書請求、公鑰等信息保存到指定文件中
-text以文本格式輸出數字證書請求的內容
-pubkey輸出公鑰
-new新建數字證書請求
-newkey rsa:bits新建指定位數的RSA密鑰,和-key選項互斥
-nodes配合-newkey選項,指定生成的密鑰文件不加密
-key filename指定已有密鑰的文件,和-newkey選項互斥
-keyout filename將生成的私鑰保存到指定的文件中
-config filename指定參數文件,默認為/etc/pki/tls/openssl.cnf
-x509指定生成自簽署證書
-days n配合-x509選項,指定數字證書有效期限
-batch非交互式模式
a、使用已有私鑰生成證書請求
# openssl req -new -key private.key -out client.csr
使用已有RSA私鑰、輸入主體相關信息,生成證書請求文件,并將其保存至client.csr文件。
# openssl req -new -key private.key -out client.csr -batch -pubkey
使用已有RSA私鑰生成證書請求文件,指定-batch選項,主體相關信息從配置文件中讀取。并將證書請求和公鑰數據保存至client.csr文件。
b、自動生成密鑰和證書請求
# openssl req -new -newkey rsa:512 -out client.csr -keyout private.key -batch -pubkey
從配置文件中讀取主體相關信息,自動生成512位RSA密鑰和證書請求。將私鑰保存至private.key文件中;將公鑰和證書請求保存至client.csr文件中。
# openssl rsa -in private.key
輸入保存密鑰時設置的密碼,解密private.key中的密鑰。
# openssl req -new -newkey rsa:512 -out client.csr -keyout private.key -batch -pubkey -nodes
從配置文件中讀取主體相關信息,自動生成512位RSA密鑰和證書請求。將私鑰保存至private.key文件中;將公鑰和證書請求保存至client.csr文件中。指定-nodes選項,密鑰文件不加密。
c、生成自簽證書
# openssl req -new -x509 -newkey rsa:512 -out client2.crt -keyout private2.key -batch -pubkey -nodes
在自動生成證書請求命令中添加-x509選項即可。
d、查看證書請求和證書內容
# openssl req -in client.csr -text | less
查看證書請求文件的內容。
# openssl x509 -in client2.crt -text | less
查看自簽證書文件的內容。
5、利用openssl創建私有CA并簽發數字證書
a、根據/etc/pki/tls/openssl.cnf文件的參數配置,在/etc/pki/CA/private/目錄下生成私鑰,并保存為cakey.pem。
# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
b、根據/etc/pki/tls/openssl.cnf文件的參數配置,在/etc/pki/CA/目錄下生成自簽證書,并保存為cacert.pem。
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
c、根據/etc/pki/tls/openssl.cnf文件的參數配置,在/etc/pki/CA/目錄下生成index.txt(此文件保存已簽署的證書信息),serial,并向serial文件中覆蓋重定向01數字(此為簽署證書的編號)。
# touch /etc/pki/CA/index.txt && touch /etc/pki/CA/serial && echo 01 > /etc/pki/CA/serial
d、簽署證書請求。
# openssl ca -in client.csr -out client.crt
通過查看/etc/pki/CA/index.txt文件,可發現自建的私有CA已成功簽署了一份證書。
參考文獻
[1] Linux.cn. (2016).openssl 證書請求和自簽名命令 req 詳解-技術 ◆ 學習|Linux.中國-開源社區. [online] Available at: https://linux.cn/article-7248-1.html [Accessed 10 May 2016].
[2] Wikipedia. (2016).Transport Layer Security. [online] Available at: https://en.wikipedia.org/wiki/Transport_Layer_Security [Accessed 10 May 2016].