SSL及其開源實現OpenSSL+創建私有CA

SSL:Secure sockets Layer 安全套接字層,是工作於傳輸層和網絡之間,利用加密和解密技術,保障應用層各應用程序在網絡傳輸過程中安全傳輸。主要版本有V1.0, V2.0, V3.0,目前常用版本是V2.0.

SSl會話主要三步:

  客戶端向服務器端索要並驗正證書;

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

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

其中前兩步稱爲會話握手,主要可分爲四個階段:

  第一階段:ClientHello:客戶端向服務器端發送會話,內容如下:

    支持的協議版本,比如tls 1.2;

    客戶端生成一個隨機數,稍後用於生成“會話密鑰”;

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

    支持的壓縮算法;

  第二階段:ServerHello:服務端器向客戶端迴應會話,內容如下:

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

    服務器端生成一個隨機數,稍後用於生成“會話密鑰”;

    確認使用的加密方法;

    發送服務器證書;

    索要客戶端證書;(一般是不需要此過程的)

  第三階段:客戶端收到服務器證書的操作:

    驗正服務器證書,在確認無誤後取出其公鑰;(驗證過程不再詳述,可參考上篇博客。)

    發送以下信息給服務器端:

     一個隨機數;(用於服務器公鑰加密)

     編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;

     客戶端握手結束通知;

  第四階段:服務器端收到客戶端發送信息的作操:

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

    向客戶端發送如下信息:

     編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;

     服務端握手結束通知;

以上便是SSl簡單的工作原理,那麼SSL只是一種協議,他是如何具體實現這種安全機制的呢?下面我們來說一下SSL的開源實現OpenSSL。

OpenSSL,即開源實現SSL功能的工具,由三部分組成:

  libencrypto加密解密庫,僅用於加密解密;

  libssl庫,用於安全傳輸;

  openssl多用途命令行工具;

其中libencrypto和libssl主要由開發者使用,這裏我們重點介紹openssl多用途命令行工具。

openssl由衆多的子命令,分爲三類:

  標準命令;

  消息摘要命令;(由dgst子命令調用)

  加密命令;(由enc子命令調用)

  查看當前openssl版本的命令爲:openssl version

wKiom1cJv3eDvudaAAAJFVBnlvc052.png

  常用的標準命令有:enc(加密)、ca(建立私有CA)、req(申請證書)、genrsa(生成rsa算法密鑰對)、rand(生成隨機數)、dgst(單向加密)...

下面我們就來使用openssl工具手動加密:

對稱加密:

  工具:openssl enc

  支持算法有:3des,aes,blowfish....

  enc命令:

    加密:~]# openssl enc -e -des3 -a -salt -in file -out file

     -e:表示加密;

     -des3:表示加密算法爲3des,也可以使用別的加密算法;

     -a:以base64編碼格式顯示,默認爲二進制格式;

     -salt:表示“加鹽”;

     -in:表示要加密的文件;

     -out:表示加密後的文件;

    例如:用3des加密算法給/etc/fstab文件加密,加密密碼爲mageedu:

wKioL1cJw6-TR73vAADWREG5BlA489.png

   加密後可查看加密後的文件

    解密:~]# openssl enc -d -des3 -a -salt -in file -out file

     -d:表示是解密;

    例如:將上面加密碼了的文件解密:

wKioL1cJx1fSaHJ_AABelz7Cg9M535.png

單向加密:

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

  dgst命令:

   ~]# openssl dgst -md5 /PATH/TO/SOMEFILE

     -md5:表示MD5算法;也可以使用其它算法;

   例如:對fstab文件用MD5算法做單向加密,取其特徵碼:

wKioL1cJyMzQw1K4AAAOIK8utIs405.png

    也可以便用md5sum命令對其做單向加密,取其特徵碼:

wKioL1cJyRej0QO9AAAMnzN6EAo427.png

    對比發現,特徵碼是一樣的,只是顯示方式不一樣。

生成用戶密碼:

  工具:openssl passwd,passwd

   openssl passwd -1(MD5) -salt SALT

     -1:表示MD5算法;目前只支持MD5算法;

     SALT:表示隨機數,可以手動自己加,也可以使用命令獲取;

    例如:獲取mageedu加密後的密碼:

wKiom1cJyjfjxdqMAAAfJ8LT9sk304.png

    發現隨機數一點的變化,會造成密碼很大的變化;

生成隨機數:

  工具:openssl rand

   ~]# openssl rand [-hex|-base64] NUM

     -hex:表示以十六進制格式顯示;

     -base64:表示以base64編碼格式顯示;

     NUM:表示隨機數字節數;

    例如:生成一個10字節的隨機數,以十六進制格式顯示;

wKiom1cJy7qTHHE6AAATwjNPG6A833.png

    相同命令發現,隨機數隨機生成的,每個都不一樣。

公鑰加密:

  生成私鑰: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)

     由於私鑰保密性比較重要,所以私鑰只允許屬主有讀寫權限,所以用umask 077,生成的私鑰權限將自動

  生成爲600的權限。

     genrsa子命令:表示生成rsa算法的密鑰對;

     -out:表示私鑰生成後保存的路徑;

    NUM_BITS:表示生成私鑰的位數;

    例如:生成一個1024位的私鑰,保存爲/tmp/mykey

wKiom1cJ0BGh3rsbAACJaB9fMl8446.png

     生成1024位私鑰,且權限爲600;

  提出公鑰: ~]#openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -out /PATH/TO/PRIVATE_KEY_FILE -pubout

    rsa:表示爲rsa算法;

    -in:表示私鑰位置;

    -out:表示提取公鑰後存放位置;

    -pubout:表示提取公鑰;

    例如:從上面的私鑰中提取對應公鑰,保存爲/tmp/pubkey:

wKioL1cJ0mPzuPFVAAAyUTilCSg225.png

以上介紹了使用openssl工具各種算法手動加密的過程,接下來將介紹如何使用openssl工具來建立私有CA。

CA:有公共CA和私有CA,公共CA有專門機構來負責管理,這裏我們只介紹小範圍內的私有CA。

  建立私有CA有兩種工具:openssl和OpenCA,openssl在小範圍內使用,OpenCA一般在企業內使用,此處我們

介紹小範圍內的私有CA的創建,使用openssl工具:

在創建私有CA前我們先CA的配置文件:/etc/pki/tls/openssl.cnf內包含CA的一些常用路徑:

   CA工作目錄:/etc/pki/CA

  頒發證書存放目錄:/etc/pki/CA/certs

  吊銷證書存放目錄:/etc/pki/CA/crl

  新頒發證書存放目錄:/etc/pki/CA/newcerts

  頒發證書索引存放文件:/etc/pki/CA/index.txt

  頒發證書序列號存放文件:/etc/pki/CA/serial

  吊銷證書序列號存放文件:/etc/pki/CA/crlnumber

  CA自己私鑰存放文件:/etc/pki/CA/private/cakey.pem

  CA自簽證書存放文件:/etc/pki/CA/cacert.pem

那麼構建私有CA就是在確定配置爲CA的服務器上生成一個自簽證書,併爲CA提供所需要的目錄及文件即可;

  工具:openssl req

  步驟:

    (1)生成私鑰;

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

wKiom1cJ4DDQMxI-AAA3t47Jd6w221.png

      注意:私鑰存放位置必須爲/etc/pki/CA/private/且名稱必須是cakey.pem這是在配置文件中規定的。

    (2)生成自簽證書;

       ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out 

    /etc/pki/CA/cacert.pem -days 3655       

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

       -x509:生成自籤格式證書,專用於創建私有CA時;

       -key:生成請求時用到的私有文件路徑;

       -out:生成的請求文件路徑;如果自籤操作將直接生成簽署過的證書;

       -days:證書的有效時長,單位是day;

wKiom1cJ4bywWSaoAABkvzjUgw8260.png

        自籤時會填寫相應私有CA的一些信息;

    (3)爲CA提供所需的目錄及文件;

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

        創建certs,crl,newcerts這三個目錄文件,已存在的話無需創建;

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

        創建證書序列號和證書索引文件serial,index.txt;

wKioL1cJ4-LSu08-AAATDvxq4MU764.png

       ~]# echo 01 > /etc/pki/CA/serial

        第一次創建證書時,需將證書序列號輸入到serial文件中;

wKiom1cJ466yys0wAAAMeSNqDFE453.png

要用到證書進行安全通信的服務器,需要向CA請求籤署證書:

  步驟:以httpd爲例:

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

      ~]# mkdir /etc/httpd/ssl 

      ~]# cd /etc/httpd/ssl

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

wKiom1cJ5kCz2JmMAAAe5OV03fs682.png

    (2)生成證書籤署請求;

      ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days365

wKiom1cJ5z7T4OSLAABq_qmV09g188.png

      申請時填寫的信息要能和CA自簽證書中信息要能對應;

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

      ~]#scp httpd.csr root@ipadd:/PATH/FILE

      由於此處實驗是在同一網內,可用這種方式,實際可用多種方式,只要確保請求信息能安全到CA主機

wKioL1cJ6S3Cw4l5AAA23l0KXqo272.png

      在CA主機中查看確定是否收到:

wKiom1cJ6LKA9OauAAAchxm6JeM200.png

    (4)在CA主機上籤署證書;

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

wKiom1cJ6Wnx08nxAACIrcpskYY156.png

    (5)將簽署好的證書發給申請主機:

      ~]#scp /etc/pki/CA/certs/httpd.crt root@ipadd:/PATH

      此處同樣使用scp命令,不再多說。

wKioL1cJ6wXxBFqgAAA1KG3JBt4773.png

      可在申請證書的主機上查看是否收到簽署的證書:

wKiom1cJ6o_gcjG6AAAHLPkvt2o565.png

至此,申請簽署證書已經完成,可以使用簽署的證書。注意:申請完成後,需要在申請主機和CA主機上把申請信息刪除,保證安全。此處不再演示。

如果自己私鑰丟失,需要向CA申請吊銷證書:

  步驟:

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

      獲取吊銷證書方法:

        ~]# openssl x509 -in /PATH(證書路徑) -noout -serial -subject

wKioL1cJ70Hz01zjAAATNO2MR8E037.png

    (2)CA主機吊銷證書:

      先根據客戶提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致;

      吊銷:# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

wKiom1cJ77fwC8LPAAATh2eGTkA019.png

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

      # echo 01 > /etc/pki/CA/crlnumber

wKioL1cJ8UXAMWl4AAAL4Ev3mR8995.png

    (4)更新證書吊銷列表:

      # openssl ca -gencrl -out thisca.crl

wKioL1cJ8cGRNHLJAAASKGlL8DI178.png

      也可以查看crl文件:# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text

wKioL1cJ8mXSuOA3AABcSW-HqUk599.png

至此,吊銷證書已完成,不過在實驗情況下,一般不會用到吊銷證書,大家只需瞭解就行。

那麼現在SSl和OpenSSL以及建立私有CA都已經跟大家介紹完成,可能其中有些不合理的地方,希望大家相互學習相互指教,謝謝!







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