SSL(Secure Socket Layer,安全套接字層)是為網(wǎng)絡(luò)通信提供安全保障和數(shù)據(jù)完整性的一種安全協(xié)議,由Netscape公司研發(fā)。SSL協(xié)議位于網(wǎng)絡(luò)的應(yīng)用層和傳輸層之間,它接受來自上層網(wǎng)絡(luò)應(yīng)用層協(xié)議(如http、ftp)的數(shù)據(jù)報文,并將其再一次進(jìn)行封裝、加密,再傳遞給下層網(wǎng)絡(luò)傳輸層協(xié)議(如tcp、udp)。該協(xié)議提供的服務(wù)主要有:
a、數(shù)據(jù)來源可靠性:一次網(wǎng)絡(luò)連接中的客戶端和服務(wù)器都會被驗(yàn)證是否是對方所期望連接的主機(jī)。確保數(shù)據(jù)將被正確地發(fā)送至客戶端和服務(wù)器。
b、數(shù)據(jù)機(jī)密性:數(shù)據(jù)在發(fā)送之前被加密,保證其在網(wǎng)絡(luò)傳輸過程中,不會被竊取。
c、數(shù)據(jù)完整性:數(shù)據(jù)在接收之后,接收端主機(jī)會根據(jù)數(shù)據(jù)的特征碼以驗(yàn)證數(shù)據(jù)的完整性,保證其在網(wǎng)絡(luò)傳輸過程中,不會被篡改。
就SSL提供的以上服務(wù)中,以數(shù)據(jù)來源可靠性最為重要。SSL采用非對稱加密算法(如RSA)來保證網(wǎng)絡(luò)中互聯(lián)雙方的真實(shí)性?;ヂ?lián)雙方各擁有一對密鑰,公私鑰。其中公鑰是公開的,網(wǎng)絡(luò)中的任何人都可以得到任何主機(jī)或用戶的公鑰,而唯獨(dú)私鑰是保密的。且公鑰是從其對應(yīng)私鑰中提取出來的。對于公鑰加密的文件,僅能通過其對應(yīng)的私鑰解密,由此便保證了數(shù)據(jù)的機(jī)密性。對于私鑰加密的文件,僅能通過其對應(yīng)的公鑰解密,由此便保證了數(shù)據(jù)來源的可靠性。
openssl便是SSL的一個開源實(shí)現(xiàn)。本文后續(xù)內(nèi)容將簡要介紹如何用openssl進(jìn)行加解密、提取數(shù)據(jù)特征碼、生成密鑰,以及生成數(shù)字證書請求、創(chuàng)建私有CA和簽發(fā)數(shù)字證書。
1、利用openssl進(jìn)行加解密
openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] ...
-ciphername指定加密算法,例如:-base64
-in filename指定要加密的文件,filename為該文件的文件名
-out filename指定將加密后的數(shù)據(jù)保存到filename指定的文件中
-e指定為加密過程,此為默認(rèn)過程
-d指定為解密過程
示例:
# openssl enc -base64 -in plaintext.txt -out ciphertext.txt
采用base64加密算法將plaintext.txt文件中的數(shù)據(jù)加密,并保存到ciphertext.txt文件中。
# openssl enc -base64 -in ciphertext.txt -d
采用base64算法解密ciphertext.txt文件中的數(shù)據(jù),并打印到顯示屏幕。

2、利用openssl提取數(shù)據(jù)特征碼
openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [file...] ...
-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1指定提取數(shù)據(jù)特征碼的單向加密算法
-c指定特征碼輸出格式,每兩位跟上一個冒號
file指定要提取數(shù)據(jù)特征碼的文件
示例:
# openssl dgst -md5 -c plaintext.txt
采用md5單項(xiàng)加密算法提取plaintext.txt文件的數(shù)據(jù)特征碼。即使是當(dāng)文件中的數(shù)據(jù)遭到微小的篡改,再次計算得出的數(shù)據(jù)特征碼都會和原先的特征碼大相徑庭。

3、利用openssl生成密鑰
openssl genrsa [-out filename] [numbits] ...
-out filename指定將生成的私鑰保存到filename文件中
numbits指定私鑰的長度(位數(shù))
openssl rsa [-in filename] [-out filename] [-pubout] ...
-in filename指定私鑰文件
-out filename指定將從私鑰中提取出的公鑰保存到filename文件中
-pubout指定從私鑰中提取公鑰
示例:
# (umask 077; openssl genrsa -out private.key 512)
括號中的命令將在子shell中運(yùn)行。第一條命令改變子shell中的umask值,令生成的文件除屬主外,其他人對他無任何權(quán)限,保證了私鑰的機(jī)密性。采用RSA非對稱加密算法生成512位的私鑰,并將其保存到private.key文件中。
# openssl rsa -in private.key -pubout
從private.key中的私鑰中提取出公鑰,并打印到顯示屏幕。

4、利用openssl生成數(shù)字證書請求
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從指定文件中讀取數(shù)字證書請求
-out filename將生成的數(shù)字證書請求、公鑰等信息保存到指定文件中
-text以文本格式輸出數(shù)字證書請求的內(nèi)容
-pubkey輸出公鑰
-new新建數(shù)字證書請求
-newkey rsa:bits新建指定位數(shù)的RSA密鑰,和-key選項(xiàng)互斥
-nodes配合-newkey選項(xiàng),指定生成的密鑰文件不加密
-key filename指定已有密鑰的文件,和-newkey選項(xiàng)互斥
-keyout filename將生成的私鑰保存到指定的文件中
-config filename指定參數(shù)文件,默認(rèn)為/etc/pki/tls/openssl.cnf
-x509指定生成自簽署證書
-days n配合-x509選項(xiàng),指定數(shù)字證書有效期限
-batch非交互式模式
a、使用已有私鑰生成證書請求
# openssl req -new -key private.key -out client.csr
使用已有RSA私鑰、輸入主體相關(guān)信息,生成證書請求文件,并將其保存至client.csr文件。


# openssl req -new -key private.key -out client.csr -batch -pubkey
使用已有RSA私鑰生成證書請求文件,指定-batch選項(xiàng),主體相關(guān)信息從配置文件中讀取。并將證書請求和公鑰數(shù)據(jù)保存至client.csr文件。

b、自動生成密鑰和證書請求
# openssl req -new -newkey rsa:512 -out client.csr -keyout private.key -batch -pubkey
從配置文件中讀取主體相關(guān)信息,自動生成512位RSA密鑰和證書請求。將私鑰保存至private.key文件中;將公鑰和證書請求保存至client.csr文件中。


# openssl rsa -in private.key
輸入保存密鑰時設(shè)置的密碼,解密private.key中的密鑰。

# openssl req -new -newkey rsa:512 -out client.csr -keyout private.key -batch -pubkey -nodes
從配置文件中讀取主體相關(guān)信息,自動生成512位RSA密鑰和證書請求。將私鑰保存至private.key文件中;將公鑰和證書請求保存至client.csr文件中。指定-nodes選項(xiàng),密鑰文件不加密。

c、生成自簽證書
# openssl req -new -x509 -newkey rsa:512 -out client2.crt -keyout private2.key -batch -pubkey -nodes
在自動生成證書請求命令中添加-x509選項(xiàng)即可。

d、查看證書請求和證書內(nèi)容
# openssl req -in client.csr -text | less
查看證書請求文件的內(nèi)容。

# openssl x509 -in client2.crt -text | less
查看自簽證書文件的內(nèi)容。

5、利用openssl創(chuàng)建私有CA并簽發(fā)數(shù)字證書
a、根據(jù)/etc/pki/tls/openssl.cnf文件的參數(shù)配置,在/etc/pki/CA/private/目錄下生成私鑰,并保存為cakey.pem。
# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
b、根據(jù)/etc/pki/tls/openssl.cnf文件的參數(shù)配置,在/etc/pki/CA/目錄下生成自簽證書,并保存為cacert.pem。
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem
c、根據(jù)/etc/pki/tls/openssl.cnf文件的參數(shù)配置,在/etc/pki/CA/目錄下生成index.txt(此文件保存已簽署的證書信息),serial,并向serial文件中覆蓋重定向01數(shù)字(此為簽署證書的編號)。
# 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文件,可發(fā)現(xiàn)自建的私有CA已成功簽署了一份證書。
參考文獻(xiàn)
[1] Linux.cn. (2016).openssl 證書請求和自簽名命令 req 詳解-技術(shù) ◆ 學(xué)習(xí)|Linux.中國-開源社區(qū). [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].