openssl

一、openssl簡介

SSL(secure socket lawyer)安全套接字協議是web瀏覽器與web服務器之間進行安全交換信息的協議,提供兩個基本的服務:保密和鑑別。

SSL在3.1版本之後改名爲TLS;ssl協議位於應用層協議和TCP/IP協議之間。

ssl的特性:

保密性:在握手協議中定義了會話密鑰後,所有的消息都被加密。

鑑別性:可選的客戶端認證和強制的服務器端認證。

完整性:傳遞的消息包括信息完整性檢查


OpenSSL整個軟件包大概可以分成三個主要的功能部分:密碼算法庫、SSL協議庫以及應用程序。OpenSSL的目錄結構自然也是圍繞這三個功能部分進行規劃的。 

對稱加密算法:

OpenSSL一共提供了8種對稱加密算法,其中7種是分組加密算法,僅有的一種流加密算法是RC4。這7種分組加密算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持電子密碼本模式(ECB)、加密分組鏈接模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它算法使用的則是64位。事實上,DES算法裏面不僅僅是常用的DES算法,還支持三個密鑰和兩個密鑰3DES算法。 

非對稱加密算法:

OpenSSL一共實現了4種非對稱加密算法,包括DH算法、RSA算法、DSA算法和橢圓曲線算法(EC)。DH算法一般用戶密鑰交換。RSA算法既可以用於密鑰交換,也可以用於數字簽名,當然,如果你能夠忍受其緩慢的速度,那麼也可以用於數據加密。DSA算法則一般只用於數字簽名。 

信息摘要算法:

OpenSSL實現了5種信息摘要算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事實上包括了SHA和SHA1兩種信息摘要算法,此外,OpenSSL還實現了DSS標準中規定的兩種信息摘要算法DSS和DSS1。 

密鑰和證書管理:

密鑰和證書管理是PKI的一個重要組成部分,OpenSSL爲之提供了豐富的功能,支持多種標準。 

首先,OpenSSL實現了ASN.1的證書和密鑰相關標準,提供了對證書、公鑰、私鑰、證書請求以及CRL等數據對象的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各種公開密鑰對和對稱密鑰的方法、函數和應用程序,同時提供了對公鑰和私鑰的DER編解碼功能。並實現了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標準中提供了對私鑰的加密保護功能,使得密鑰可以安全地進行存儲和分發。 

在此基礎上,OpenSSL實現了對證書的X.509標準編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一種文本數據庫,支持證書的管理功能,包括證書密鑰產生、請求產生、證書籤發、吊銷和驗證等功能。 

事實上,OpenSSL提供的CA應用程序就是一個小型的證書管理中心(CA),實現了證書籤發的整個流程和證書管理的大部分機制。


二、安裝openssl


1、yum安裝:

#yum -y install openssl openssl-devel

2、源碼安裝:需要注意linux自帶的openssl,可以rpm -e卸載了再安裝

下載地址:https://www.openssl.org/source/

#wget 
#tar xf openssl-1.0.1u.tar.gz
#cd openssl-1.0.1u
#./config --perfix=/usr/local/openssl
#make
#make install
#配置環境變量或者做鏈接文件:
#ln -s /usr/local/openssl/bin/openssl /usr/bin/opensll
#ln -s /usr/local/openssl/include/openssl /usr/include/openssl
#echo "/usr/local/openssl/lib"  >> /etc/ld.so.conf
#ldd /usr/local/openssl/bin/openssl
#ldconfig -v

3、openssl升級:

由於使用yum安裝版本太低,只能通過源碼編譯安裝了,跟上面的源碼安裝基本相同:

關於openssl的編譯選項的解讀:

全局選項

第一類是全局性選項:

--openssldir=OPENSSLDIR 安裝目錄,默認是 /usr/local/ssl 。

--prefix=PREFIX 設置 lib include bin 目錄的前綴,默認爲 OPENSSLDIR 目錄。

--install_prefix=DESTDIR 設置安裝時以此目錄作爲"根"目錄,通常用於打包,默認爲空。

zlib    使用靜態的zlib壓縮庫

zlib-dynamic    使用動態的zlib壓縮庫

no-zlib    不使用zlib壓縮功能。

threads    是否編譯支持多線程的庫

no-threads 是否編譯支持多線程的庫。默認支持。

shared    是否生成動態連接庫

no-shared 不生成動態連接庫。

asm    是否在編譯過程中使用匯編代碼加快編譯過程。

no-asm 不在編譯過程中使用匯編代碼加快編譯過程。

enable-sse2
no-sse2 啓用/禁用SSE2指令集加速。如果你的CPU支持SSE2指令集,就可以打開,否則就要關閉。

gmp
no-gmp 啓用/禁用GMP庫

rfc3779
no-rfc3779 啓用/禁用實現X509v3證書的IP地址擴展

krb5
no-krb5 啓用/禁用 Kerberos 5 支持

ssl
no-ssl
ssl2
ssl3
no-ssl2
no-ssl3
tls
no-tls 啓用/禁用 SSL(包含了SSL2/SSL3) TLS 協議支持。

dso
no-dso 啓用/禁用調用其它動態鏈接庫的功能。[提示]no-dso僅在no-shared的前提下可用。

# wget https://www.openssl.org/source/openssl-1.1.1-pre6.tar.gz
# tar xf openssl-1.1.1-pre6.tar.gz
# cd openssl-1.1.1-pre6
# ./config shared zlib      
# make
# make install
#修改歷史的openssl文件備份
# mv /usr/bin/openssl /usr/bin/openssl.bak
# mv /usr/include/openssl /usr/include/openssl.bak
#設置軟鏈接使其使用新的openssl版本
# ln -s /usr/local/bin/openssl /usr/bin/openssl
# ln -s /usr/local/include/openssl /usr/include/openssl
#更新動態鏈接庫數據
# echo "/usr/local/lib64" >> /etc/ld.so.conf
# ldconfig -v
# openssl version
OpenSSL 1.1.1-pre6 (beta) 1 May 2018

三、openssl常用命令

openssl command [ command_opts ] [ command_args ]
常用command:
version    用於查看版本信息
enc        用於加解密
ciphers    列出加密套件
genrsa    用於生成私鑰
rsa        RSA密鑰管理(例如:從私鑰中提取公鑰)
req        生成證書籤名請求(CSR)
crl        證書吊銷列表(CRL)管理
ca         CA管理(例如對證書進行簽名)
dgst      生成信息摘要
rsautl    用於完成RSA簽名、驗證、加密和解密功能
passwd    生成散列密碼
rand      生成僞隨機數
speed      用於測試加解密速度                    
s_client  通用的SSL/TLS客戶端測試工具
X509       X.509證書管理
verify      X.509證書驗證
pkcs7       PKCS#7協議數據管理

1、申請證書:

SSL常用於身份驗證、數據加密等應用中,要使用SSL,我們密碼有自己的證書。數字證書一般要向專業的認證公司(如VeriSign)申請,並且都是收費的,某些情況下,我們只是想使用加密的數據通信,而不在乎認證,這時就可以自己製作一個證書,自己製作一個證書,有兩種方式,一種是Self Signed,另一種是自己製作一個CA,然後由這個CA,來發布我們需要的證書。下面分別介紹這兩個方法。

(1)生成self signed自己簽名的證書:

#生成一個key,你的私鑰,openssl會提示輸入一個密碼;會在本路徑下生成一個server.key文件:

選項解釋:genrsa生成私鑰;-des3制定加密方式;-out制定密鑰文件及位數。

[root@localhost ~]# openssl genrsa -des3 -out server.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
.............++
...................................................................++
e is 65537 (0x010001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

#使用上面生成的key,生成一個(CSR)證書籤名請求,如果你的key有密碼包含,openssl會詢問你的密碼,然後詢問一系列的問題,其中最重要的是(common name),它代表你的證書要代表的目標,如果你爲網站申請的證書,就要添加你的域名。

選項解釋:req生成簽名請求;-new 新的請求;-key使用文件中包含的密鑰;-out將密鑰輸出到文件。

# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:china
string is too long, it needs to be no more than 2 bytes long
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:beijin
Locality Name (eg, city) []:beijinshi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:panjiayuan
Organizational Unit Name (eg, section) []:pjy
Common Name (e.g. server FQDN or YOUR name) []:www.pjy.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

#生成self signed簽名證書:

選項解釋:X.509證書管理;-req輸入是證書請求、簽名和輸出;-days簽署證書到期多長時間;-in輸入文件;-signkey帶ARG的自我簽名證書;out輸出到文件。
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=C = CN, ST = beijin, L = beijinshi, O = panjiayuan, OU = pjy, CN = pjy, emailAddress = [email protected]
Getting Private key
Enter pass phrase for server.key:

#另外的方法就是集合上面的命令,一次性生成key和證書

選項解釋:req生成證書籤名請求;-x509輸出X509結構而不是證書Req;-nodes不要加密輸出密鑰;-days簽署證書到期多長時間;-newkey rsa在指定大小上生成一個新的“bits”的RSA密鑰;-keyout 指定RSA密鑰文件名;-out輸出證書文件。

# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt
Generating a 2048 bit RSA private key
....................................................................................+++
.+++
writing new private key to 'privateKey.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

會生成一個privatekey.key私鑰文件和certificate.crt證書文件。


(2)生成自己的CA (Certificate Authority),通過CA發佈證書。

CA是證書的發佈者,CA可以發佈其他人的證書,把CA的證書加入系統信任的根證書後,由CA發佈的證書也被系統所信任,所以,CA的key是必須小心保護的,一般都要加密保護,並且限制爲root權限讀寫。

#生成CA的key
#openssl genrsa -des3 -out ca.key 4096
 
#生成CA的證書
#openssl req -new -x509 -days 365 -key ca.key -out ca.crt
 
#生成我們的key和CSR這兩步與上面Self Signed中是一樣的
#openssl genrsa -des3 -out myserver.key 4096
#openssl req -new -key myserver.key -out myserver.csr
 
#使用ca的證書和key,生成我們的證書
#這裏的set_serial指明瞭證書的序號,如果證書過期了(365天后),
#或者證書key泄漏了,需要重新發證的時候,就要加1
#openssl x509 -req -days 365 -in myserver.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out myserver.crt

 

2、查看證書

#查看KEY信息
#openssl rsa -noout -text -in myserver.key
 
#查看CSR信息
#openssl req -noout -text -in myserver.csr
 
#查看證書信息
#openssl x509 -noout -text -in ca.crt
 
#驗證證書
#會提示self signed
#openssl verify selfsign.crt
 
#因爲myserver.crt是幅ca.crt發佈的,所以會驗證成功
#openssl verify -CAfile ca.crt myserver.crt
 
去掉key的密碼保護
#有時候每次都要輸入密碼太繁瑣了,可以把Key的保護密碼去掉
#openssl rsa -in myserver.key -out server.key.insecure
 
不同格式證書的轉換
一般證書有三種格式:
PEM(.pem)前面命令生成的都是這種格式,
DER(.cer .der) Windows上常見
PKCS#12文件(.pfx .p12) Mac上常見
 
# PEM轉換爲DER
#openssl x509 -outform der -in myserver.crt -out myserver.der
 
# DER轉換爲PEM
#openssl x509 -inform der -in myserver.cer -out myserver.pem
 
# PEM轉換爲PKCS
#openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
 
# PKCS轉換爲PEM
#openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes
 
測試證書
Openssl提供了簡單的client和server工具,可以用來模擬SSL連接,做測試使用。
 
#連接到遠程服務器
#openssl s_client -connect www.google.com.hk:443
 
#模擬的HTTPS服務,可以返回Openssl相關信息
# -accept用來指定監聽的端口號
# -cert -key用來指定提供服務的key和證書
#openssl s_server -accept 443 -cert myserver.crt -key myserver.key -www
 
#可以將key和證書寫到同一個文件中
#cat myserver.crt myserver.key > myserver.pem
#使用的時候只提供一個參數就可以了
#openssl s_server -accept 443 -cert myserver.pem -www
 
#可以將服務器的證書保存下來
#openssl s_client -connect www.google.com.hk:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > remoteserver.pem
#轉換成DER文件,就可以在Windows下直接查看了
#openssl x509 -outform der -in remoteserver.pem -out remoteserver.cer

3、RSA應用:

#產生1024位RSA私匙,用3DES加密它,口令爲trousers,
#輸出到文件rsaprivatekey.pem
# openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024
 
#從文件rsaprivatekey.pem讀取私匙,用口令trousers解密,
#生成的公鑰匙輸出到文件rsapublickey.pem
# openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem
 
#用公鑰匙rsapublickey.pem加密文件plain.txt,
#輸出到文件cipher.txt
# openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
 
#使用私鑰匙rsaprivatekey.pem解密密文cipher.txt,
#輸出到文件plain.txt
# openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
 
#用私鑰匙rsaprivatekey.pem給文件plain.txt簽名,
#輸出到文件signature.bin
# openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
 
#用公鑰匙rsapublickey.pem驗證簽名signature.bin,
#輸出到文件plain.txt
# openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain
 
#從X.509證書文件cert.pem中獲取公鑰匙,
#用3DES加密mail.txt
#輸出到文件mail.enc
# openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem
 
#從X.509證書文件cert.pem中獲取接收人的公鑰匙,
#用私鑰匙key.pem解密S/MIME消息mail.enc,
#結果輸出到文件mail.txt
# openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt
 
# cert.pem爲X.509證書文件,用私匙key,pem爲mail.txt簽名,
#證書被包含在S/MIME消息中,輸出到文件mail.sgn
# openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn
 
#驗證S/MIME消息mail.sgn,輸出到文件mail.txt
#簽名者的證書應該作爲S/MIME消息的一部分包含在mail.sgn中
# openssl smime -verify -in mail.sgn -out mail.txt

4、消息摘要算法應用例子

#用SHA1算法計算文件file.txt的哈西值,輸出到stdout
# openssl dgst -sha1 file.txt
 
#用SHA1算法計算文件file.txt的哈西值,輸出到文件digest.txt
# openssl sha1 -out digest.txt file.txt
 
#用DSS1(SHA1)算法爲文件file.txt簽名,輸出到文件dsasign.bin
#簽名的private key必須爲DSA算法產生的,保存在文件dsakey.pem中
# openssl dgst -dss1 -sign dsakey.pem -out dsasign.bin file.txt
 
#用dss1算法驗證file.txt的數字簽名dsasign.bin,
#驗證的private key爲DSA算法產生的文件dsakey.pem
# openssl dgst -dss1 -prverify dsakey.pem -signature dsasign.bin file.txt
 
#用sha1算法爲文件file.txt簽名,輸出到文件rsasign.bin
#簽名的private key爲RSA算法產生的文件rsaprivate.pem
# openssl sha1 -sign rsaprivate.pem -out rsasign.bin file.txt
 
#用sha1算法驗證file.txt的數字簽名rsasign.bin,
#驗證的public key爲RSA算法生成的rsapublic.pem
# openssl sha1 -verify rsapublic.pem -signature rsasign.bin file.txt

5、base64應用:

#對字符abc進行base64編碼
#echo abc | openssl base64
結果爲:YWJjCg==
#對YWJjCg==解碼
#echo YWJjCg== | openssl base64 -d
結果爲:abc
#對文件t.txt進行base64編碼
#openssl base64 -in t.txt
結果爲:aGVsbG8K
#對aGVsbG8K進行解碼
#echo aGVsbG8K | openssl base64 -d
結果爲:abc
#對t.txt進行編碼並將結果輸出到t.base64文件裏
#openssl base64 -in t.txt -out t.base64
#若編碼值存放在t.base64文件裏,對其進行解碼
#openssl base64 -d -in t.base64
結果爲abc

6、des3應用:

# 對稱加密應用例子
# 用DES3算法的CBC模式加密文件plaintext.doc,
# 加密結果輸出到文件ciphertext.bin
# openssl enc -des3 -salt -in plaintext.doc -out ciphertext.bin

# 用DES3算法的OFB模式解密文件ciphertext.bin,
# 提供的口令爲trousers,輸出到文件plaintext.doc
# 注意:因爲模式不同,該命令不能對以上的文件進行解密
# openssl enc -des-ede3-ofb -d -in ciphertext.bin -out plaintext.doc -pass pass:trousers

# 用Blowfish的CFB模式加密plaintext.doc,口令從環境變量PASSWORD中取# 輸出到文件ciphertext.bin
# openssl bf-cfb -salt -in plaintext.doc -out ciphertext.bin -pass env:PASSWORD


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章