openssl基礎應用

參考http://www.www58058.com/2704

http://www.williamlong.info/archives/837.html

一、前言

什么是openssl?講openssl之前我們先了解下什么是ssl?ssl是secure socket layer的簡稱,其使用對稱加密解密,非對稱加密解密(公鑰加密解密),單向加密解密結合證書實現數據傳輸安全。openssl默認是在系統安裝時就安裝上去的。

二、加密解密基礎

2.1.1、對稱加密

對稱加密解密使用同一個口令,它將明文分割成固定大小的塊,逐個進行加密解密。對稱加密可以使用加密算法實現,如DES,3DES,AES,RC6等。基本上基于口令加密都容易遭到暴力破解,特別是弱口令。

對稱加密過程示意圖

blob.png

解析:1.hostA中有一段明文plain text,它使用對稱加密算法加密,加密后的結果是一段密文,假設密文內容為cipher text

   2.密文cipher text在網絡中傳輸到達hostB

   3.hostB使用對稱解密開這段密文得到內容為plain text

2.1.2對稱加密演示

[root@vm tmp]# openssl enc -des3  -a -in /tmp/fstab  -out /tmp/testEnc2 -salt      #通過子命令enc生成一個被加密的文件
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@vm tmp]# ls
fstab  testEnc2
[root@vm tmp]# tail -3 testEnc2                    #tail被加密的文件發現其是一大段意義不明的字符串
3GQbP7EL/w/XGGweQ7Xb+ekahJ3+BJ5yJcLaBmXolyK/iYNhrOkGvuYQ4yeHEyNi
/YZwVVWWO+5CwD+C4ex+bMX/r9ZATyB1r1Cs99t00pELe2OfJq4zI1kg2f2nBn6O
heakkClQGYE=
[root@vm tmp]# openssl enc -d -des3 -a -salt -in /tmp/testEnc2 -out /tmp/lookEnc2   #使用-d參數解密被加密的文件
enter des-ede3-cbc decryption password:
[root@vm tmp]# tail -3 /tmp/lookEnc2
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

2.2.1、非對稱加密(公鑰加密)

非對稱加密使用一組密鑰來進行加密,啟動公鑰通過某種方式從私鑰中取出。當使用公鑰加密時只有對應的私鑰可以解密,當使用私鑰加密時,只有對應的公鑰可以解密。非對稱加密常用的加密算法有RSA,DSA,EIGamal等。

非對稱加密過程示意圖

使用公鑰加密

公鑰加密.jpg

解析:1.alice與bob通信,alice使用bob的公鑰對plaintext加密

   2.然后把加密的數據傳輸給bob

   3.bob使用自己的私鑰解密這段密文,得出plaintext

使用私鑰加密

私鑰加密.jpg

解析:1.alice與bob通信,alice使用自己的私鑰加密plaintext

   2.加密的數據傳輸給bob

   3.bob使用alice的公鑰解密,得出plaintext

2.2.2、非對稱加密演示

[root@vm tmp]#(umask 077;openssl genrsa -out /tmp/mykey  1024)   #小括號中的內容只對子shell有效,對當前shell無效,
Generating RSA private key, 1024 bit long modulus
........++++++
...................++++++
e is 65537 (0x10001)
[root@vm tmp]# tail -3 /tmp/mykey
R6petXjJEm0jx7ROMQJBAI8kzvCsVSciokdgQbKTVhxAvkPO09655EUnSl0g+7o0
gpIIdCDCZPq12wlWr4rTtbyr1SCIQgnCTpLbhaeOwiI=
-----END RSA PRIVATE KEY-----
[root@vm tmp]# openssl rsa -in /tmp/mykey -out /tmp/pubkey -pubout  #通過rsa子命令從私鑰中提前公鑰
writing RSA key
[root@vm tmp]# tail -3 /tmp/mykey
R6petXjJEm0jx7ROMQJBAI8kzvCsVSciokdgQbKTVhxAvkPO09655EUnSl0g+7o0
gpIIdCDCZPq12wlWr4rTtbyr1SCIQgnCTpLbhaeOwiI=
-----END RSA PRIVATE KEY-----

2.3、單向加密

單向加密是一個定長輸出一段特征碼,當數據改變時,那么其特征碼也變了。無法再還原回去,即雪崩效應。常用的單向加密算法有MD5,SHA1,SHA256,SHA512等等。

[root@vm tmp]# openssl dgst -md5 -out /tmp/testDgst /tmp/fstab       #通過dgst子命令提取fstab的指紋信息
[root@vm tmp]# echo 1 >> /tmp/fstab                                    #修改fstab文件
[root@vm tmp]# openssl dgst -md5 -out /tmp/testDgst2 /tmp/fstab      #再次提前指紋信息
[root@vm tmp]# cat /tmp/testDgst*
MD5(/tmp/fstab)= b3aaa48b658b3ef180665b40ccb438f8                          #發現fstab指紋信息不一致
MD5(/tmp/fstab)= b26bf7c4625b7aee995ffacaa086f95a

2.4、數據包在網絡中安全傳輸過程

如下圖

blob.png

三、基于證書的認證

由于在網絡上傳輸公鑰,很容易被別有用心的人莫名頂替,從而造成一些麻煩事。如果我們不直接傳送公鑰,而是證書,并且可以通過第三方認證機構來驗明證書是否有效,那么就安全多了。PKI正是(Publick Key Infrastructure)公鑰基礎設施提供公鑰加密和數字簽名,目的是為了了管理密鑰和證書,一個機構通常采用PKI架構管理密鑰和證書可以建立一個安全的網絡環境。提到PKI,我們不得不提下X.509定義了證書的格式,大體如下圖

 blob.png

3.1、自建CA

在內網環境中,我們如果對數據傳輸安全性要求較高,又不想投入大量的金錢。那么自建一個CA是一個不二的選擇。

CA工作過程如下圖

blob.png

實際過程可能比圖中所示更復雜,這里這個給出個大概,下面將講解自建CA的基本過程,對于需要CA實地考察公司之類,發送文件給CA或者CA把證書發送給客戶端中這些過程由于是做實驗,這些一筆帶過。

3.1.1、服務器端建立CA

1.生成密鑰

(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048 -des3)    #生成ca的私鑰,長度2048
Generating RSA private key, 2048 bit long modulus
.................+++
..........................................+++
e is 65537 (0x10001)

2.自簽證書

[root@vm ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
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) [XX]:CN                                   #所填的信息中包含一部分x.509定義證書的一部分信息
State or Province Name (full name) []:SZ   
Locality Name (eg, city) [Default City]:SZ
Organization Name (eg, company) [Default Company Ltd]:LEON
Organizational Unit Name (eg, section) []:LEON
Common Name (eg, your name or your server's hostname) []:vm
Email Address []:

3.初始化工作環境

[root@vm ~]# touch /etc/pki/CA/{index.txt,serial}
[root@vm ~]# echo 01 >/etc/pki/CA/serial

3.1.2、客戶端申請證書

1.生成密鑰對及證書請求

[root@vm ~]# mkdir /etc/rsa && (umask 077 ;openssl genrsa -out /etc/rsa/my.key 2048 -des3)   #客戶端生成密鑰對
Generating RSA private key, 2048 bit long modulus
.......+++
.........................+++
e is 65537 (0x10001)
 
[root@vm ~]# openssl req -new -key /etc/rsa/my.key -out /etc/rsa/my.csr            #生成證書請求
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) [XX]:CN
State or Province Name (full name) []:SZ
Locality Name (eg, city) [Default City]:SZ
Organization Name (eg, company) [Default Company Ltd]:LEON
Organizational Unit Name (eg, section) []:LEON
Common Name (eg, your name or your server's hostname) []:vm
Email Address []:
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

3.把簽署請求文件發給CA服務器

由于我們是同一臺主機上做實驗,故不需要把my.csr證書請求文件發送給ca服務器

3.2、服務器簽署證書

3.2.1 服務器簽署證書

[root@vm ~]# openssl ca -in /etc/rsa/my.csr -out /etc/rsa/my.crt -days 365   #簽署證書,有效期為365天
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 19 20:59:44 2015 GMT
            Not After : Sep 18 20:59:44 2016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = SZ
            organizationName          = LEON
            organizationalUnitName    = LEON
            commonName                = vm
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                05:86:66:D3:31:06:06:2F:B4:E0:60:F3:42:E1:95:2B:BA:33:40:F7
            X509v3 Authority Key Identifier:
                keyid:72:50:29:0A:4B:D9:9B:A0:BF:E0:D1:7F:8E:3B:E0:F5:B9:40:30:69
 
Certificate is to be certified until Sep 18 20:59:44 2016 GMT (365 days)
Sign the certificate? [y/n]:y
 
 
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
 
[root@vm CA]# cat index.txt     #查看index文件,存放證書subject信息,其中V表示可用證書
V       160918205944Z                01     unknown  /C=CN/ST=SZ/O=LEON/OU=LEON/CN=vm
[root@vm CA]# cat serial        #查看下一個預將生成的版本號
02

3.2.2發送給請求者

由于在一臺主機上操作,服務器端和客戶端都是自己,故不需要發送給請求者

3.3、證書吊銷

1.獲取證書節點

[root@vm CA]# openssl x509 -in /etc/rsa/my.crt -noout -serial -subject   #獲取證書節點信息(serial和subject)
serial=01
subject= /C=CN/ST=SZ/O=LEON/OU=LEON/CN=vm

2.CA根據節點提交的serial和subject信息來驗證inxex.txt文件中信息是否一致

[root@vm CA]# cat index.txt     
V       160918205944Z                01     unknown  /C=CN/ST=SZ/O=LEON/OU=LEON/CN=vm

3.吊銷證書

[root@vm CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem              #吊銷證書
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated

4.生成吊銷證書的編號(如果是第一次吊銷)

echo 00 > /etc/pki/CA/crlnumber

5.更新證書吊銷列表

[root@vm crl]# openssl ca -gencrl -out thisca.crl
Using configuration from /etc/pki/tls/openssl.cnf

四、總結

對稱加密、非對稱加密、單向加密這三個算法需要了解其加密過程,對于了解如何在網絡上安全傳輸數據有很大的幫助,openssl是個強大的工具,但是其命令也非常多。故我們使用過程中可能會忘記這個命令的使用方法,這個時候只有man下這個命令。由于本人畫圖技術水平太爛,故一不小心去copy了下其他人的圖片,文章開頭已指明參考文檔。

 

原創文章,作者:成吉思汗,如若轉載,請注明出處:http://www.www58058.com/8379

(0)
成吉思汗成吉思汗
上一篇 2015-09-27 15:54
下一篇 2015-09-28 15:37

相關推薦

  • shuc之學習目標

    1,每天學習二小時 2,半年熟悉數據中心LINUX技術

    Linux干貨 2016-10-23
  • 每日一練–8.10 腳本

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。 2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中 3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空…

    Linux干貨 2016-08-15
  • VIM 詳用!

    1、復制/etc/rc.d/rc.sysinit文件至/TMP目錄,將/tmp/rc.sysinit文件的至少一個空白字符開頭的行首加 :%s/^[[:space:]]/#/ 2、復制/boot/grub/grub.conf 至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符; :%s/[[:space:]]\+// 3、刪除/tmp/…

    Linux干貨 2017-08-20
  • Linux初認識

    1、計算機的五大部件 CUP: CUP中包含了兩大部件分別是運算器、控制器。其中運算器主要是進行數學運算、邏輯運算等各種運算的。除了兩大部件以外CUP內部還有寄存器、緩存,它們是提升CUP性能的輔助性工具。 存儲器: 內存RAM(Random Access Memory)。 輸入設備Input: 輸入設備用來下指令,提供數據等。輸入設備有鍵盤,鼠標,麥克風等…

    Linux干貨 2017-07-09
  • python裝飾器詳解

    python之裝飾器詳解 一、裝飾器定義 定義一個函數,可以接受一個函數作為參數,對該函數進行一些包裝,不改變函數的本身。 二、裝飾器四部曲(分解) 1、函數可賦值給變量。若賦值給變量的是調用后的函數,變量的值就是return的返回值。 切記:函數賦值給變量,只看return的值。分清楚函數是處于調用狀態還是未被調用狀態。若函數沒有寫return,默認ret…

    2017-02-08
  • 第五周練習

    1、顯示當前系統上root、fedora或user1用戶的默認shell 2、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一小組括號的行,刑如:hello() 3、使用echo命令輸出一個絕對路徑,使用grep取出基名 4、找出ifconfig命令結果中的1-255之間的數字 5、查找/var目錄下屬主為root,且屬組為mai…

    2017-10-29

評論列表(1條)

  • Vicky
    Vicky 2015-09-27 16:02

    內容很實用~

欧美性久久久久