淺談Openssl與私有CA搭建

    隨著網絡技術的發展、internet的全球化,信息共享程度被進一步提高,各種基于互聯網的應用如電子政務、電子商務日益增多并愈加被人們工作和生活依賴。但是,由于互聯網的開放性和通用性,網絡上的信息是對所有人公開的,這就使網絡上的數據傳輸過程中存在被竊聽、篡改等安全隱患,并極有可能給用戶帶來不可估量的損失。為此,各種保證數據在互聯網上安全傳輸的機制紛紛出現,而OpenSSL(Sercure Socket Layer)技術就是其中之一。

    什么是SSL?

    SSL(Sercure Socket Layer)  由于數據在傳輸層和網絡層傳送以及封裝均已明文方式存在,不能加密,而應用層只能對數據本身加密不能保證數據傳過程中的安全,SSL則是工作在TCP/IP協議與應用層協議之間,實現數據傳輸的安全和數據完整性的一種協議。該協議能通過多種加、解密方式結合證書機制來完成安全認證、訪問控制、數據保密性、數據完整性和通訊的不可否認性等功能。而OpenSSL則是SSL的開源實現。

    數據的加密、解密

    根據密碼算法和協議,數據的加密、解密方式可以分為四類:

      1、對稱加密   所謂對稱加密是指通信的雙方使用同一個密鑰來進行加解密。算法使用DES、AES、Blowfish、Twofish、IDEA、RC6、CAST5等,使用該加密方式的客戶端,對每一個通訊對象都要維護一個密鑰并且無法保證密鑰交換、身份驗證和數據完整性驗證,并且易于受到基于字典窮舉方式攻擊。

      2、非對稱加密 又稱公鑰加密。使用此種加密方式通訊方會通過算法生成成對存在的私鑰和密鑰,使用私鑰加密的數據只能用自己的公鑰解密,反之亦然。因此可以以較為公開的方式將公鑰傳送給通訊對方,而對方可以通過是否能使用此公鑰來解密相應的數據信息來驗證通訊方的身份,完成網絡通訊安裝的身份驗證。該加密方式使用的算法有RSA(用于加密和身份驗證)、DSA(只能實現身份驗證)EIGamal等,由于這些算法的密鑰位數過長(一般都是2048位及以上),因此一般不用于加密數據,只是用于身份驗證。

      3、單向加密   又稱數據完整性校驗加密方式,可以利用算法計算數據指紋信息,此種方式得出的數據指紋信息具有定長和雪崩效應(數據中的微小變化將會導致數據指紋信息的巨大變化)的特性,常用來實現數據完整性的驗證。

    網絡數據傳輸的加密、解密過程

         blob.png

    如上圖場景,加密解密過程如下:

         第一步,用戶B向服務器A發起訪問請求,并攜帶自己的證書信息。

         第二步,服務器A收到用戶B發來的證書后,查找系統內置或通過其它可靠途徑獲得證書公鑰解密(非對稱加密)證書的簽名信息,完成CA的合法身份驗證,并得到簽名信息的特征碼,而后使用同樣的算法提取簽名信息的特征碼與之對比,完成簽名信息的完整性校驗。隨后從用戶B中發來的證書中提取用戶B的公鑰信息,最后將自己的證書發送給用戶B。

         第三步,用戶B收到服務器A發來的證書,使用與之同樣的證書驗證流程驗證證書的合法性以及完整性,提取服務器A的公鑰信息。

         第四步,服務器A將需要發送給用戶B的數據分段后通過以下步驟對其進行加密(以數據段S0為例進行詳解):

                 1、使用單向加密算法,提取數據的SO的特征碼信息。 #用到單向加密

                 2、使用自己的私鑰加密上一步提取出來的特征碼信息,而后將其附在數據S0后面,組成數據段S1。#用到公鑰加密

                 3、通過算法生成密鑰,利用對稱加密對數據段S1進行加密,生成加密后的數據段S2。#用到對稱加密

                 4、使用用戶B的公鑰將上一步生成的密鑰加密后將其附在數據段S2后面,生成數據段S3。最后將S3發送給用戶B。#用到公鑰加密

         第五步,用戶B收到服務器A發來的數據段S3后通過一下步驟進行解密:

                 1、使用自己的私鑰解密數據段S3,得到服務器A生成的對稱加密密鑰和數據段S2。#使用公鑰加密和對稱加密完成密鑰交換

                 2、使用上一步解密得到的密鑰解密數據段S2得到加密后的數據特征碼(由服務器A通過單向加密基于數據段SO提取而得)和明文數據段S0。

                    #用到對稱加密

                 3、使用自己的私鑰解密上一步得到的數據特征碼,然后使用與服務器A相同的單向加密的算法提取明文數據S0的特征碼與之比對,比對結果正確則說明數據時完整的。#通過單向加密和公鑰加密同時完成整數據完整性認證和身份驗證

    PKI 公鑰基礎設施

    通過上面的詳述,我們已經對網絡數據傳輸加密解密的過程有了清晰的認識,而這個過程中的關鍵之處即通訊雙方公鑰(證書)的獲取是要依賴于PKI這個服務平臺來實現的,下面來詳細的了解一下它。

      PKI(Public Key Infrastructure) 公共基礎設施,是一種提供公鑰加密和數字簽名的平臺,目的是為了管理密鑰和證書。一個完整的有效的PKI由如下組成部分:

         1、認證機構CA       數字證書的申請及簽發機關,CA必須具備權威的特性。

         2、數據證書庫      用于存儲已簽發的數據證書和公鑰,用戶可由此獲得所需的其他用戶的證書以及公鑰。

          3、密鑰備份和恢復系統 為防止用戶解密密鑰丟失造成數據無法解密而存在,此功能必須由可信機構完成,并且密鑰備份只備份解密密鑰,簽名密鑰為保證其唯一性不做備份。

          4、應用接口(API) 為方便用戶使用加密、數字簽名等安全服務而提供的良好的應用接口,使得各種應用能以安全、一致可信的方式與PKI交互,確保網絡環境的完整性和易用性。

          5、證書作廢系統    PKI的必備組件,用來作廢那些由于于用戶密鑰丟失、證書過期、以及證書持有者身份變更等導致證書信息已不可用的證書。

       CA     

       通常來說,CA是PKI系統的核心,為實現證書發放、證書更新、證書撤銷和證書驗證等功能,CA由以下幾個部分組成:

          1、注冊服務器:用于實現客戶在網上提出證書申請和填寫證書相應的證書申請表。

          2、證書申請受理和審核機構:用來接受客戶的證書申請并進行審核。

          3、認證中心服務器:用于數字證書的生成、發放,提供發放證書的管理、證書吊銷列表的生成和處理。

       具體實施時,CA要做以下工作:

          1、驗證并標識證書申請者的身份。

          2、確保用于證書簽名的公鑰加密密鑰對的保密性。

          3、確保簽名過程的安全性,確保簽名私鑰的安全性。

          4、證書資料(證書序列號、CA標識等)的管理。

         5、確保并檢查證書的有效期。

          6、確保數字簽名證書的唯一性。

          7、及時更新并發布證書吊銷列表。

          8、維護證書簽訂過程的日志記錄。

          9、將證書發送給申請人。 

      數字證書的通用格式為X509格式,其證書結構如下圖:

          blob.png

    OpenSSL

   在我們的linux平臺上,加密和解密、PKI以及CA等一系列的保證網絡數據安全傳輸的機制,都是通過openssl這個開源的工具來實現的,因此能深刻的了解它對于學習后面的高級相關應用是至關重要的。

   執行yum -y install openssl,安裝完成后,我么可以通過rpm -ql openssl來查看其安裝后生成的、比較常用的路徑和文件。如下圖

   blob.png

   openssl是一個多用途的命令行工具,可以調用子命令分別實現加密、解密,創鍵私有CA以及CA管理的功能。

    blob.png

    openssl的用法

    1、查看openssl版本號 使用openssl version

    blob.png

    2、對稱加密

     工具 openssl enc  算法DES 3DES AES Blowfish Twofish RC6 IDEA CAST5等。

     用法 openssl enc

              -e 加密操作

              -d 解密操作

              -ciphername 指定算法 

              -a 指定基于base64編碼處理數據

              -in /path/from/somefile 指定需要加密的文件的

              -out /path/to/somefile 指定文件加密后存儲位置

              -salt 添加字符串增加密碼強度

    例:將/var/log/messages拷貝至/tmp/下使用DES算法進行加密解密,并使用cat查看驗證。

       blob.png

      加密并驗證 

       blob.png      

      解密并確認

    3、單向加密

      工具 openssl dgst,md5sum,sha1sum,chsum 

         openssl dgst -[md5|sha1] [-out /path/tosomefile] /path/form/somefile

             – [md5|sha1] 指定算法

             -out /path/to/somefile 將提取的特征碼信息保存到指定文件,不指定輸出到屏幕

                /path/from/somefile 指定需要執行單項加密的文件

     例:將/var/log/messages拷貝至/tmp/下,分別使用openssl dgst -md5 和md5sum對其進行單向加密

       blob.png

    4、加密用戶密碼

      openssl passwd -1 -salt SALT SALT一般是8位的字符串 (-1 指定使用md5進行加密,CentOS 6 一般使用sha512)

     例:

      blob.png

     其中-salt后面的字符串可以使用隨機獲取字符來替代,

      openssl 隨機生成字符串 

      openssl rand [-hex|-base64] number (number指定生成隨即字符串的位數)

              -hex 指定十六位編碼模式

              -base64 指定base64編碼模式

     例:blob.png

     5、公鑰加密

      生成密鑰 openssl genrsa -out /path/to/keyfile number 

      例:

      blob.png

     提取公鑰信息 

           openssl rsa -in /path/from/privat_keyfile [-out /path/to/pub_keyfile] -pubout 如果-out選項不指定則輸出結果到屏幕


     blob.png

    6、搭建私有CA

    由于證書的注冊費用相當昂貴,而有時候我們只是需要在公司內部或VPN相連的虛擬內網中利用CA認證來管理服務器資源,這個時候我們就可以利用openssl來搭建私有的CA服務器,用以簽名、頒發證書,管理已簽名證書和已吊銷證書等。

    首先,配置服務器端 

          第一步,配置CA服務器的主配置文件,設定默認私有CA配置信息。

          blob.png

          blob.png

          第二步,初始化CA環境,在/etc/pki/CA/下建立證書索引數據庫文件index.txt和序列號文件serial,并為證書序列號文件提供初始值。

          blob.png

          第三步,生成密鑰,生成自簽署證書。

           生成密鑰并保存到/etc/pki/CA/private/cakey.pem

          blob.png

          生成根證書

          命令 openssl req 常用的選項如下

                      -new  生成新證書請求

                      -x509 特指生成根證書 而不是證書請求

                      -key /path/from/file_key.pem  指定生成的密鑰文件(根證書必須是/etc/pki/CA/private/cakey.pem, 主配置文件中已定義)

                      -out /path/to/file_cert.pem   指定根證書的名字以及存放路徑(必須是/etc/pki/CA/cacert.pem,主配置文件中已定義)

                      -days 證書的有效期限

          本CA的根證書創建:

          blob.png

         至此,CA搭建完畢。

    7、這臺虛擬服務器配置了http服務,我們可以來為http服務器申請證書,并在本機簽名證書來驗證CA。

         第一步,創建目錄/etc/httpd/ssl用來存放密鑰文件和證書申請文件;創建密鑰文件和證書申請文件

         blob.png

         第二步 簽署,證書,由于節點和CA都在同一臺主機,因此可以直接簽署

              證書簽署命令openssl ca -in /path/from/somefile.csr -out /path/to/somefile.crt -days -in指定證書請求文件,-out指定證書生成文件以及路徑

         blob.png

      驗證index.txt和serial序列號更新

        blob.png

    8、同樣以http服務器為例,以一臺主機作為節點驗證私有CA

         第一步,創建目錄/etc/httpd/ssl用來存放密鑰文件和證書請求文件、證書;創建密鑰文件、創建證書請求文件。

         blob.png

         第二步,將證書請求文件發送給CA;CA簽完證書后將證書發送給節點主機

         節點與CA間的文件發送,使用scp (sercure cp)命令

         scp /path/from/somefile x.x.x.x:path/ (其中x.x.x.x是主機IP地址)

        blob.png

        已發送到CA主機,到CA上去簽署證書

        blob.png

         CA簽署完證書,并將證書發送回節點/root下,節點可以自定義存放至/etc/httpd/ssl/下。

        blob.png

       上圖驗證信息庫。

    9、吊銷證書

        把第8部分申請的證書吊銷,用來驗證吊銷列表

        第一步,查看證書的序列號

        openssl x509 -in /path/from/certficate_file.crt -noout -serial -subject

                 x509 指定證書類型

                 -in /path/from/certficate_file.crt 指定需要吊銷的證書

                 -noout 不輸出多余信息

                 -serial 輸出序列號 

                 -subject 輸出摘要信息

       blob.png

       CA上查看index.txt比對subject信息

       blob.png

       第一次執行證書吊銷要創建吊銷列表文件,并傳遞初始值,然后吊銷證書

       blob.png

       吊銷證書

       openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem(SERIAL.pem是需要吊銷的證書的序列號對應的證書文件)

       blob.png

      更新并生成吊銷列表

      blob.png

      查看吊銷列表

      openssl crl -in /path/from/some.crl -noout -text 

                  -in /path/from/somefile.crl 指定吊銷列表文件

                  -noout 不輸出額外信息

                  -text  文本顯示

      blob.png

    如有錯誤之處,敬請指正!

      

     

      

       

       

             

               

            

           

                 

                      

                    

           

           

                

    

 

    

    








  

    

原創文章,作者:Silently,如若轉載,請注明出處:http://www.www58058.com/4879

(0)
SilentlySilently
上一篇 2015-06-04
下一篇 2015-06-05

相關推薦

  • 關于綁定與不綁定CPU的對比

        此文嚴格意義上說,我沒有很大的把握,其中關于CPU調度域的概念現在還有些混淆,但還是發出來,希望能做點鋪路的貢獻吧。    另外CPU調度域的原理我沒辦法自己寫,能力尚淺, 只能將IBM知識庫 和 另一位博主的文章摘錄如下,并添加了些幫助理解的圖片,希望能幫助到初學者。 …

    Linux干貨 2016-05-03
  • N26 第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。    who | cut -d" " -f1 | sort -u    2、取出最后登錄到當前系統的用戶的相關信息。    who | tail -1 3、取…

    Linux干貨 2017-02-16
  • rsyslog記錄日志于mysql

    rsyslog記錄日志于mysql:     前提:準備好msql server或mariadb server;     (1) 安裝rsyslog連接至mysql server的驅動模塊;        &n…

    Linux干貨 2016-12-05
  • Linux第八周小結

    1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態 在線的主機使用綠色顯示 不在線的主使用紅色顯示 #!/bin/bash # for i in {1..254};do if ping -c 6 -w 1 192.168.1.$i &> /dev/null;then echo -e…

    Linux干貨 2017-08-20
  • 用戶和組管理類命令詳解

    用戶和組管理類命令詳解 組管理 groupadd 功能描述:創建一個新組 命令格式: groupadd [選項] GROUP 選項: -g GID 表示指定GID,默認情況下使用的是最小的未使用過的GID -r 表示創建一個系統組 groupmod 功能描述:修改組屬性 命令格式:groupmod [選項] GROUP 選項: -g GID 表示修改GID …

    Linux干貨 2017-07-16
  • shell腳本編寫-3

    1、for循環 for 變量名 in  列表;do 循環體 done 執行機制:依次將列表中元素賦值給“變量名”;每次賦值后即執一次循環體;直到列表中元素耗盡循環結束 列表生成方式: (1) 直接給出列表 (2) 整數列表: (a){start..end} (b) $(seq [start [step]] end)  (3) 返回列表的命…

    Linux干貨 2016-08-18
欧美性久久久久