天天看點

Linux自學筆記——OpenSSL指令行工具

      OpenSSL是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能以及ssl協定,并提供程式供測或其他目的使用。

      傳輸層協定:TCP, UDP, SCTP

           port:程序位址,程序向核心注冊使用某端口(獨占)

      同一主機上的程序間通信:IPC , message queue,shm,semerphor

      不同主機上的程序間通信:socket

                 監聽模式:LISTEN(ip:port)

      SSL:Secure Socket Layer

           http --> ssl --> https

      安全的目标:

           保密性:confidentiality

           完整性:integrity

           可用性:availability

      攻擊類型:

           威脅保密性的攻擊:竊聽、通信量分析;

           威脅完整性的攻擊:更改、僞裝、重放、否認

           威脅可用性的攻擊:拒絕服務(DoS)

      解決方案:

           技術(加密和解密)、服務(用于抵禦攻擊的服務,也即是為了上述安全目标而特地設計的安全服務)

           加密和解密:

                 傳統加密方法:替代加密方法、置換加密方法

                 現代加密方法:現代塊加密方法

           服務:

                 認證機制

                 通路控制機制

           密鑰算法和協定

                 對稱加密

                 公鑰加密

                 單向加密

                 認證協定

Linux系統:OpenSSL(ssl),GPG(pgp)

      OpenSSL由三部分組成:

           libencrypto庫

           libssl庫

           openssl多用途指令行工具

      加密算法和協定:

           對稱加密:加密和解密使用同一個密鑰;

                 DES:Data EncryptionStandard;

                 3DES:triple DES

                 AES:Advanced EncryptionStandard;(128bits,192bits,256bits,384bits)

                 Blowfish

                 Twofish

                 IDEA

                 RC6

                 CAST5

                 特性:

1.     加密、解密使用同一個密鑰

2.     将原始資料分割稱為固定大小的塊,組個進行加密;

缺陷:

1.     密鑰過多;

2.     密鑰分發困難;

公鑰加密:密鑰分為公鑰與私鑰

         公鑰:從私鑰中提取産生;可公開給所有人;pubkey

         私鑰:通過工具建立,使用者自己留存,必須保證其私密性;secret key

                 特點:用公鑰加密的資料,隻能使用與之配對的私鑰解密;反之亦然;

                 用途:

                      數字簽名:主要在于讓接收方确認發送方的身份;

                      密鑰交換:發送方用對方公鑰加密一個對稱密鑰,并發送給對方;

                      資料加密

                 算法:RSA,DSA,ELGamal

                      DSS:Digital SignatureStandard

                      DSA:Digital SignatureAlgorithm

           單向加密:即提出資料指紋;隻能加密不能解密;

                 特性:定長輸出、雪崩效應;

                 功能:保證資料完整性;

                 算法:

                      md5:message digest 5,  128bits

                      sha1:secure hashalgorithm 1, 160bits

                            sha224,sha256,sha384,sha512

           密鑰交換:IKE(InternetKey Exchange)

                 DH(deffie-Hellman)

                      A: p,g

                      B: p,g

                      A:x --> p^x%g==>B

                            A:(p^y%g)^x=p^yx%g

                      B: y

                            --> p^y%g ==>A

                            B: (p^x%g)^y=p^xy%g

      PKI:Public Key Infrastructure

           公鑰基礎設施:

                 簽證機構:CA

                 注冊機構:RA

                 證書吊銷清單:CRL

                 證書存取庫:

           x.509v3:定義了證書的結構以及認證協定标準

                 版本号

                 序列号

                 簽名算法ID

                 發行者名稱

                 有效期限

                 主體公鑰

                 發行者的唯一辨別

                 擴充

                 發行者的簽名

      SSL:Secure sockets Layer

           Netscape: 1994

           V1.0, V2.0, V3.0

      TLS:Transport Layer security

           IETF:1999

           V1.0, V1.1, V1.2, V1.3

           分層設計:

1.     最底層:基礎算法原語的實作,aes,rsa,md5

2.     向上一層:各種算法的實作;

3.     再向上一層;組合算法實作的半成品;

4.     用各種元件拼裝而成的各種成品密碼學協定軟體;

SSL/TLS

      SSL:安全套接字層(ssl 1.0,ssl2.0,ssl3.0)

      TLS:傳輸層安全(tls 1.0,tls1.1,tls 1.2,tls 1.3)

SSL會話的主要三步:

      用戶端向伺服器端索要并驗證證書;

      雙方協商生成“會話密鑰”;

      雙方采用“會話密鑰”進行加密通信;

      SSL Handshake Protocol:ssl握手協定

           第一階段:ClientHello

                 支援協定的版本,比如tls 1.2;

                 用戶端生成一個随機數,稍後使用者生成“會話密鑰”

                 支援的加密算法,比如AES、3DES、RSA;

                 支援的壓縮算法;

           第二階段:serverhello

                 确認使用的加密通信協定版本,比如tls 1.2;

                 伺服器端生成一個随機數,稍後用于生成“會話密鑰”

                 确認使用的加密方法;

                 伺服器證書;

           第三階段:

驗證伺服器證書,在确認無誤後取出其公鑰;(發證機構、證書完整性、證書持有者、證書有效期、吊銷清單)

發送以下資訊給伺服器端:

          一個随機數;

          編碼變更通知,表示随後的資訊都将用雙方商定的加密方法和密鑰發送;

          用戶端握手結束通知;

           第四階段:

                 收到用戶端發來的第三個随機數pre-master-key後,計算生成本次會話所有用到的“會話密鑰”;

                 向用戶端發送如下資訊;

                      編碼變更通知,表示随後的資訊都将用雙方商定的加密方法和密鑰發送;

                      服務端握手結束通知;

Openssl(2)

元件:

      libcrypto,libssl主要由開發者使用;

      openssl:多用途指令行工具;

openssl:

      從多子指令,分為三類:

           标準指令

           消息摘要指令(dgst子指令)

           加密指令(enc子指令)

      标準指令:enc,ca,req,genrsa,…

      對稱加密:

           工具:openssl  enc   gpg

           支援的算法:3des,aes,blowfish,towfish

           enc指令:

                 加密:~]# openssl  enc -e  -des3  -a -salt  -in fstab   -out fstab.ciphertext

                 解密:~]# openssl  enc -d  -des3  -a -salt  -out fstab   -in fstab.ciphertext

      單向加密:

           工具:openssl dgst,md5sum,sha1sum,sha224sum,…

           dgst指令:~]#openssl dgst –md5/path/to/somefile

           一般可以驗證檔案的完整性。

      生成使用者密碼:

           工具:passwd,openssl  passwd

                 openssl passwd -1 –salt  SALT

           Note:salt不同,相同的密碼,輸出也不同。

      生成随機數:

           工具:openssl rand

           ~]# openssl  rand -hex  NUM

           ~]# openssl  rand -base  NUM

      公鑰加密:

           加密解密:

                 算法:RSA,ELGamal

                 工具:openssl rsautl,gpg

           數字簽名:

                 算法:RSA,DSA,ELGamal

           密鑰交換:

                 算法:DH

           生成密鑰:

                 生成私鑰:#(umask077 ;openssl genrsa –out /path/to/private_key_fileNUM_BITS)

                 提出公鑰:#openssl rsa –in /path/from/private_key_file  -pubout

Linux系統上的随機數生成器:

      /dev/random:僅從熵池傳回随機數;随機數用盡,阻塞;

      /dev/urandom:從熵池傳回随機數;随機數用盡,會利用軟體生成僞随機數,非阻塞;僞随機數不安全;

           熵池中随機數的來源;

                 磁盤IO中斷時間間隔

                 鍵盤IO中斷時間間隔

CA:

      公共信任的CA,私有CA;

      建立私有CA:

           openssl

           OpenCA

      openssl指令:

           配置檔案:/etc/pki/tls/openssl.cnf

建構私有CA示例:準備兩台主機,一台作CA主機192.168.19.128,一台作使用者主機192.168.19.134(證書請求主機)

建構私有CA:在确定配置為CA的服務上生成一個自簽證書,并為CA提供所需要的目錄及檔案即可;

步驟:

1)    生成私鑰:

~]# (umask077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

<a href="https://s5.51cto.com/wyfs02/M00/A6/EA/wKioL1ndubOiOZU4AACrEAT01YY890.png-wh_500x0-wm_3-wmp_4-s_3207608040.png" target="_blank"></a>

2)    生成自簽證書;

~]# opensslreq -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem-days 3655

    -new:生成新證書簽署請求;

    -x509:生成自簽格式證書,專用于建立私有CA;

    -key:生成請求時用到的私鑰檔案路徑;

    -out:生成的請求檔案路徑;如果自簽操作将直接生成簽署過的證書

    -days:證書的有效時長,機關為day;

<a href="https://s2.51cto.com/wyfs02/M01/08/38/wKiom1neKM_R4sxrAAHPJSwhJY0215.png-wh_500x0-wm_3-wmp_4-s_2572943916.png" target="_blank"></a>

3)    為CA提供所需的目錄及檔案;

~]# mkdir  -pv /etc/pki/CA/{certs,crl,newcerts}

~]# touch  /etc/pki/CA/{serial,index.txt}

~]# echo  01 &gt; /etc/pki/CA/serial

<a href="https://s2.51cto.com/wyfs02/M01/A6/EA/wKioL1nduc6Q28Q9AAAhE2Qs3kA768.png-wh_500x0-wm_3-wmp_4-s_3787356178.png" target="_blank"></a>

      要用到證書進行安全通信的伺服器,需要向CA請求簽署證書;

      步驟:(以httpd為例)

1)    用到證書的主機生成私鑰:

~]# mkdir  /etc/httpd/ssl

~]# cd  /etc/httpd/ssl

~]#(umask  077; openssl  genrsa -out /etc/httpd/ssl/httpd.key  2048)

<a href="https://s3.51cto.com/wyfs02/M02/A6/EA/wKioL1ndudjytRR6AAE0ZlrWCfw993.png-wh_500x0-wm_3-wmp_4-s_1741989941.png" target="_blank"></a>

2)    生成證書簽署請求

<a href="https://s5.51cto.com/wyfs02/M00/08/38/wKiom1neKPCD7AMdAACD1smZHgA458.png-wh_500x0-wm_3-wmp_4-s_3489779625.png" target="_blank"></a>

3)    将請求通過可靠方式發給CA主機;

<a href="https://s1.51cto.com/wyfs02/M00/08/38/wKiom1neKPii-VhDAAAk5t7Q4dc737.png-wh_500x0-wm_3-wmp_4-s_326682746.png" target="_blank"></a>

可在CA主機上檢視請求主機發送的證書請求;

<a href="https://s2.51cto.com/wyfs02/M00/A6/EA/wKioL1ndufTBnZmkAADlzA1NWrY877.png-wh_500x0-wm_3-wmp_4-s_1015762267.png" target="_blank"></a>

4)    在CA主機上簽署證書;

~]# opensslca  -in /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days 365

<a href="https://s2.51cto.com/wyfs02/M01/A6/EA/wKioL1nduf3AyNh6AACBiPHTaOw223.png-wh_500x0-wm_3-wmp_4-s_3445423831.png" target="_blank"></a>

檢視 證書資訊:

    ~]# openssl x509  -in/etc/pki/CA/certs/httpd.crt  -noout  -serial -subject

5)    CA所在的主機将簽署完的證書,發送回請求主機;

<a href="https://s4.51cto.com/wyfs02/M02/A6/EA/wKioL1nduhPx6mxAAAAgzAG2VWI980.png-wh_500x0-wm_3-wmp_4-s_999637115.png" target="_blank"></a>

      吊銷證書:

      步驟:

1)    用戶端擷取要吊銷證書的serial(在使用證書的主機執行):

~]#openssl  x509 –in /etc/pki/CA/certs/httpd.crt  -noout -serial  -subject

<a href="https://s1.51cto.com/wyfs02/M02/A6/EA/wKioL1nduhuif-McAAAgFZTFZZQ477.png-wh_500x0-wm_3-wmp_4-s_3449890346.png" target="_blank"></a>

2)    CA主機吊銷證書

先根據客戶送出的serial和subject資訊,對比其與本機資料庫index.txt中存儲的是否一緻;

吊銷:

    #openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.PEM

          其中的 SERIAL要換成證書真正的序列号;

3)    生成吊銷證書的吊銷編号(第一次吊銷證書時執行)

echo 01 &gt;/etc/pki/CA/crlnumber

<a href="https://s1.51cto.com/wyfs02/M00/A6/EA/wKioL1ndujuQKtvmAAATOwBIFak440.png-wh_500x0-wm_3-wmp_4-s_3233925964.png" target="_blank"></a>

4)    更新吊銷證書清單

#openssl ca–gencrl  -out  thisca.crl

<a href="https://s1.51cto.com/wyfs02/M00/A6/EA/wKioL1ndukWQA_PfAAAWzkcluCM673.png-wh_500x0-wm_3-wmp_4-s_2958463214.png" target="_blank"></a>

檢視crl檔案:

    #openssl crl –in  /path/from/crl_file.crl  -noout –text

本文轉自 claude_liu 51CTO部落格,原文連結:http://blog.51cto.com/claude666/1971422,如需轉載請自行聯系原作者

繼續閱讀