Openssl及加密解密(二)openssl
openssl是一個條件實現了上百種算法、實現了單向加密工具等一組套件,代碼量很小但是功能強大。它有三部分組成:
libcrypto:通用功能的加密庫,軟件開發時可以直接調用
libssl:實現TLS/SSL的功能
openssl:多功能命令行工具,加密、解密、創建CA、證書、一對秘鑰等
openssl enc加密解密命令:
參數 | 說明 |
-des3 | 是指定加密算法 |
-a | 是輸出文件按base64內容輸出,否則就是二進制的 |
-in | 要加密的文件 |
-out | 加密後的文件 |
-salt | 加鹽 |
-d | 表示解密 |
我們建立一個文件進行加密,源文件為
openssl enc -des3 -a -salt -in /work/aaa.txt -out /work/aaa.enc
輸入兩次密碼
解密剛才的文件
openssl enc -d -des3 -a -salt -in /work/aaa.enc -out /work/aaa.out
openssl單向加密:
常見的有md5、sha1、sha256等,系統本身有這些工具如下圖:
我們現在用openssl dest命令來實現
openssl dgst -md5 FILE
openssl非對稱加密:
一般私鑰用來加密公鑰用來解密,但是如果要做電子簽名那麽就需要用私鑰進行加密,公鑰進行解密。最常用的是RSA。再次說明公鑰不會用來進行數據加密因為速度太慢,通常用來秘鑰交換和身份驗證。
數字簽名:
公鑰加密私鑰解密,我們知道數字簽名不會用公鑰加密數據本身,而是加密數據的特征碼。常用算法RSA、DSA(只能用來做簽名無法做加密)。簽名本身還是加密,所以這就是說明DSA只能用公鑰加密私鑰解密,不能反過來。而RSA則可以。
數字證書:
為了保證公鑰來源的可靠性。A有CA的公鑰,B向CA申請證書且證書(裏面包括B的公鑰和B的信息)中包含CA的電子簽名(CA私鑰加密的),B把證書發給A,A用CA的公鑰可以解密電子簽名來驗證有效性。證書格式包括:x509等。該證書裏的內容包含申請者的公鑰、證書過期時間、申請者的合法身份信息(地址、國家、機構名稱等)、證書使用方式、CA的信息、CA的數字簽名(CA私鑰加密的證書前4項信息的摘要信息)
我們知道在訪問電子商務網站或者銀行網站的時候都是輸入一個域名,你如何知道你訪問的這個網站就是那個真正的網站而不是別人偽造的呢?這就是用到了ssl,這個網站都是綁定了證書,你輸入的域名則包含在證書中的申請者合法身份信息中。由於客戶端信任國際主要CA機構,所以為了讓客戶端也信任他要訪問的網站,那麽網站所屬公司都要去CA申請證書,那私鑰和公鑰是誰生成的?顯然這一對而私鑰和公鑰是申請者自己生成的(你不可能讓CA給你生成,因為CA如果生成的話那就意味著CA擁有了你私鑰),然後把公鑰和其他必要信息發給CA,CA審核通過則頒發證書。所以你申請證書需要做的是:
自行生成一對私鑰和公鑰
把公鑰和域名等其他必要信息按照固定格式填寫並提交給CA
在以後的通訊中客戶端訪問網站的時候會獲取該網站的證書,然後去驗證合法性、之後還會查看有效期、最後還會去找CA查看該證書是否被吊銷了,都檢查過了以後才能安全的訪問。
我們知道openssl可以生成公鑰和私鑰也可以建立CA,我們就從這兩個方面來進行演示。兩臺機器
Linux01為服務器端--CA服務器
Linux02為客戶端--申請證書
演示:建立CA
如果你是在企業內部小範圍應用,可以使用這個工具來建立自己的CA然後給自己的服務器發放證書並管理吊銷列表等操作。
構建私有CA的配置文件在/etc/pki/tls/openssl.cnf,一般無需修改,但裏面的一些配置要了解。
參數 | 說明 |
dir | 如果想把openssl做成CA,那麽這個CA的工作目錄是哪裏 |
certs | CA簽發的證書放在這裏,默認是相對於CA的工作目錄下面的 |
crl_dir | CA吊銷的證書列表放在那裏 |
database | 索引文件數據庫,自動生成這個文件,你通過這個文件可以快速查看有哪些證書 |
new_certs_dir | 剛剛簽署的證書放在哪裏 |
certificate | CA自己的證書在哪裏,這裏是公鑰 |
serial | 當前序列號,CA簽發證書的編號 |
crlnumber | 吊銷證書的序列號 |
crl | 當前正在使用的CRL,證書吊銷列表文件 |
private_key | CA自己的私鑰 |
RANDFILE | 隨機數據文件 |
進入工作目錄/etc/pki/CA,生成私鑰對
通過這個命令生成私鑰,公鑰是通過從私鑰中提取而來的。私鑰的名字要和配置文件中的一樣
openssl genrsa -out ./private/cakey.pem 2048 #修改權限,不是必須的,只是為了安全。 chmod 600 ./private/cakey.pem
生成證書,openssl req是一個證書申請工具,同時也可以自簽名自己的證書
參數 | 說明 |
-in FILENAME | 輸入文件,但是通常我們用-key |
-key FILENAME | 指定私鑰文件,它會自己從私鑰文件中抽取出公鑰 |
-days N | 有效期限 |
-x509 | 自簽名時使用的證書格式,只有自簽名證書時采用 |
-out FILENAMEA | 證書放哪裏,只有自簽名證書時采用 |
-new | 用於一個新申請 |
openssl req -new -x509 -key ./private/cakey.pem -out cacert.pem -days 3655
cacert.pem這個也是上面那個配置文件中定義的。執行命令會開始一個向導,輸入必要信息。這個信息也可以在上面那個文件中後半部分進行定義,這樣就不用每次都輸入了。
生成缺少的3個基本文件serial、index.txt、crlnumber,創建三個文件
touche ./index.txt serial crlnumber #有可能需要的是index.txt.attr這個文件,曾經遇到過,所以你也建立一個。
初始化serial文件,你寫00也行,因為頒發證書總要有一個序號標記。
echo 01 > serial
到此CA構建完畢
演示:生成公鑰和私鑰對兒
我們這裏演示給Nginx上的站點申請證書為例,這個證書要放在Nginx的目錄中,我這裏就建立一個certs的目錄,然後申請證書。這個名字我叫做nginx.pri,其實名稱無所謂,長度我使用1024.
openssl genrsa -out ./nginx.pri 1024
生成證書請求
openssl req -new -key ./nginx.pri -out new_cacert.req
我們把生成的請求文件拷貝到CA服務器上,我這裏放/tmp下了,其實放哪裏都一樣,最後你也要使用命令簽署這個請求。
scp new_cacert.req 172.16.100.29:/tmp/
簽發證書(在CA服務器上執行),然後就可以把證書拷貝會客戶端服務器上
openssl ca -in /tmp/new_cacert.req -out /tmp/nginx.crt -days 3655
編譯安裝openssl以後系統提示找不到共享庫文件
本文出自 “小惡魔的家” 博客,請務必保留此出處http://littledevil.blog.51cto.com/9445436/1925273
Openssl及加密解密(二)openssl