1. 程式人生 > >Openssl及加密解密(二)openssl

Openssl及加密解密(二)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審核通過則頒發證書。所以你申請證書需要做的是:

  1. 自行生成一對私鑰和公鑰

  2. 把公鑰和域名等其他必要信息按照固定格式填寫並提交給CA

在以後的通訊中客戶端訪問網站的時候會獲取該網站的證書,然後去驗證合法性、之後還會查看有效期、最後還會去找CA查看該證書是否被吊銷了,都檢查過了以後才能安全的訪問。


我們知道openssl可以生成公鑰和私鑰也可以建立CA,我們就從這兩個方面來進行演示。兩臺機器

Linux01為服務器端--CA服務器

Linux02為客戶端--申請證書

演示:建立CA

如果你是在企業內部小範圍應用,可以使用這個工具來建立自己的CA然後給自己的服務器發放證書並管理吊銷列表等操作。

構建私有CA的配置文件在/etc/pki/tls/openssl.cnf,一般無需修改,但裏面的一些配置要了解。

技術分享

參數說明
dir如果想把openssl做成CA,那麽這個CA的工作目錄是哪裏
certsCA簽發的證書放在這裏,默認是相對於CA的工作目錄下面的
crl_dirCA吊銷的證書列表放在那裏
database索引文件數據庫,自動生成這個文件,你通過這個文件可以快速查看有哪些證書
new_certs_dir
剛剛簽署的證書放在哪裏
certificateCA自己的證書在哪裏,這裏是公鑰
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