加密、解密原理和openssl自建CA過程詳解

1、加密和解密相關知識簡介算法

一、信息安全標準shell

NIST(National Institute of Standards and Technology)美國國家標準與技術研究院,制定了網絡信息安全與保密的三個要素:安全

  保密性(confidentiality):信息不泄露給非受權用戶、實體或過程,或供其利用的特性。(通常包括數據保密性、隱私性。)服務器

  完整性(Integrity):數據未經受權不能進行改變的特性。即信息在存儲或傳輸過程當中保持不被修改、不被破壞和丟失的特性。(通常包括數據完整性、系統完整性。)網絡

  可用性(Availability):可被受權實體訪問並按需求使用的特性。即當須要時可否存取所需的信息。例如網絡環境下拒絕服務、破壞網絡和有關係統的正常運行等都屬於對可用性的***;併發

(這三大要素被簡稱爲:CIA)框架

儘管三要素能保證網絡信息安全和保密,但從不少從事網絡安全的研究人員的反饋發現,除了CIA外,還有另外兩個標準也被常常提醒:tcp

  真實性:一個實體是真實的,是可被驗證的。要確保數據發送方的確是它所聲稱的那我的。ide

  可追溯性:一旦受到***,能追溯***發生的原處在什麼地方。加密

二、OSI組織定義的安全框架x.800 

安全***:

  被動***:竊聽、(常見報文捕獲、監聽流量)

  主動***:假裝、重播、消息修改、拒絕服務

安全機制:

  加密、數字簽名、訪問控制、數據完整性、認證交換、流量填充、路由控制、公證

安全服務:

  認證 :同等實體認證

  訪問控制

  數據保密性:

    鏈接保密性

    無鏈接保密性

    選擇域保密性

    流量保密性

數據完整性 :不容許插入、刪除、修改、重播

不能否認性

三、加密方式和算法

1)對稱加密:採用單鑰密碼系統的加密方法,同一個密鑰能夠同時用做信息的加密和解密。

  對稱加密的算法:

    DES : 數據加密標準(56位密鑰)

    3DES

    AES :高級加密標準(128,192,256,384,512)

    Blowfish

    Twofish

    IDEA

    RC6

    CAST5

  對稱加密的特性:

    a)加密、解密使用同一口令;

    b)將明文分隔成固定大小的塊,逐個進行加密

對稱加密的缺陷:

   a)密鑰過多;

   b)密鑰傳輸;

  密鑰交換、身份驗正、數據完整性

(2)公鑰加密:由對應的一對惟一性密鑰(即公開密鑰和私有密鑰)組成的加密方法。

(公鑰是從私鑰中提取出來的。)

(公鑰加密,只能私鑰解密。私鑰加密,也只能公鑰解密。)

  密鑰:public key, secret key  (p/s)

經常使用加密算法:

  RSA, DSA, EIGamal

  (DSA:只能用於身份驗證)

(3)單向加密:不可逆的加密

單向加密特性:

   定長輸出: 不管原始數據是多大,結果大小都相同的

   雪崩效應: 輸入的微小改變,將會引發結果的巨大改變

單向加密算法:MD5(128位)、SHA一、SHA25六、SHA38四、SHA512

2、加密和解密的過程和原理

        首先問一個問題:假設B與A通訊,B向A發送報文,怎麼才能保證B的報文安全、可靠地被A接收到,而且保證報文數據的完整性?

接下來圍繞着這個問題來講明一下。

加密和解密的過程和原理以下圖:

image

加密解密過程和原理詳細說明

一、發送端B :

(1)爲保證安全,要對報文加密。加密方法有三類:對稱加密、公鑰加密和單向加密。對稱加密不安全,單向加密是不可逆的,於是使用公鑰加密。

  問題:公鑰加密安全(通常爲2048位),可是加密過程太慢了,不適用當前網絡需求,該怎麼辦?

(2)爲了解決上述問題,B能夠用單向加密提取出報文的特徵碼(特徵碼能保證報文的數據完整性),再使用自身的私鑰對特徵碼進行公鑰加密(特徵碼數據小,對其進行公鑰加密速度快),並把加密後的特徵碼附加到報文後。(使用私鑰加密是爲了驗證身份)

問題:這種方式能實現數據完整性和身份驗證的檢驗,可是卻缺失了報文的數據保密性,又該怎麼辦?

(3)爲了解決上述問題,B在把加密的特徵碼附加到報文後,把特徵碼和報文當作一個數據(假設爲data),使用對稱加密算法對該數據(data)加密得出一個密碼,再把密碼附加到該數據(data)後。爲了使得在傳輸過程當中密碼不被其餘人獲取或篡改,使用A的公鑰對密碼進行加密(只有A的私鑰能對其解密),把加密的密碼附加到數據data後,再這些數據一併發送給A。

二、接收端A:

(1)A接收到B傳來的報文,利用自身的私鑰對其解密,得到密碼。由於只有A的私鑰能對B傳來的報文(使用A的公鑰加密密碼)解密,因此能防止其餘人對該傳輸的報文進行解密而得到其中的信息,保證了數據的保密性。

(2)A利用得到的密碼解密其中對稱加密的數據,得到通過加密的特徵碼和原報文。

(3)A使用B的公鑰對該特徵碼解密,能解密則說明該報文是B發送過來的,實現了身份驗證。(假設解密後的特徵碼是fcode)

(4)A使用同等單向加密算法對接收到的原報文提取其特徵碼。使用該特徵碼和解密後得到的特徵碼(fcode)作比較,若是同樣,則說明原報文的數據完整。

問題:以上這種方式能保證數據完整性、身份驗證和數據的保密性,在加密和解密的過程當中都要用到對方的公鑰,如何在傳輸過程當中安全可靠地得到對方的公鑰就成了關鍵的一環,那該如何作呢?

答:安全可靠地獲取對方的公鑰靠CA(Certificate Authority )證書受權中心來實現。

於是接下來,咱們來講說CA。

3、CA(證書受權中心)

一、CA證書標準:x.509

x.509: 定義了證書結構和認證協議標準;(基於公鑰和數字簽名)

用於:IP安全、TLS/SSL(傳輸層安全)和S/MIME(安全電子郵件通訊)

image

x.509證書標準詳細說明:

(1)版本號(默認爲1,若是有多個擴展,可能爲3)

(2)證書序列號(是一個整數,在CA中惟一標識,代表發行了多少個證書)

(3)算法參數 (標誌用了那種算法)

(4)發行者的名稱(CA本身的名字)

(5)有效期限

(6)主體名稱(證書擁有者名稱)(很關鍵!!!)(我的用戶使用的是我的用戶名,主機使用的必須是主機名而不是ip地址)

(7)公鑰(最重要)(公鑰由證書擁有者提供)

(8)發行者的ID(CA的惟一編號)

(9)主體的ID(CA生成的證書擁有者惟一編號)

(10)擴展

(11)CA的簽名(用於驗證CA的來源合法性)

CA是相對於發送方B和接收方A的第三方,是具備公信力的機構。

二、驗證數字證書的過程

B在發送以前得到A的數字證書或A在接收以前得到B的數字證書,都會去驗證該數字證書的真僞。

以B在發送以前得到A的數字證書爲例,說明驗證數字證書的過程

(1)要用對應給A發數字證書的那個CA的公鑰去解密CA的簽名,若是能解密,則說明A的數字證書確實是那個信任的CA所頒發的證書。

(2)解密出一段特徵碼,B再使用一樣的單向加密算法提取A的數字證書的特徵碼,比較這兩個特徵碼是否同樣,若是同樣,則表示得到的A的數字證書是完整的。

(3)此後,還要去驗證該數字證書中的持有者是否是A,若是驗證經過,才能夠肯定該數字證書確實是A的數字證書。

(4)確認該數字證書的擁有者是A後,還要去查看該數字證書是否在有效期限內和是否在CA的數字證書吊銷列表中。

4、SSL層

一、SSL層

SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通訊提供安全及數據完整性的一種安全協議。

版本:sslv1, sslv2, sslv3

(ssl是介於網絡層和傳輸層之間的半層,通常被製做成公共共享庫,要想使用ssl就要調用ssl共享庫。)

image

二、https通訊過程

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL。

以https爲例,進一步說明如何依靠CA來可靠的得到通訊對方的公鑰

image

https的主要實現過程說明:

(1)在通訊以前,服務器端經過加密算法生成一對密鑰,並把其公鑰發給CA申請數字證書,CA審覈後,結合服務端發來的相關信息生成數字證書,並把該數字證書發回給服務器端。

(2)客戶端和服務器端經tcp三次握手,創建初步鏈接。

(3)客戶端發送http報文請求並協商使用哪一種加密算法。

(4)服務端響應報文並把自身的數字簽名發給服務端。

(5)客服端下載CA的公鑰,驗證其數字證書的擁有者是不是服務器端(這個過程能夠獲得服務器端的公鑰)。(通常是客戶端驗證服務端的身份,服務端不用驗證客戶端的身份。)

(6)若是驗證經過,客戶端生成一個隨機對稱密鑰,用該密鑰加密要發送的URL連接申請,再用服務器端的公鑰加密該密鑰,把加密的密鑰和加密的URL連接一塊兒發送到服務器。

(7)服務器端使用自身的私鑰解密,得到一個對稱密鑰,再用該對稱密鑰解密經加密的URL連接,得到URL連接申請。

(8)服務器端根據得到的URL連接取得該連接的網頁,並用客戶端發來的對稱密鑰把該網頁加密後發給客戶端。

(9)客戶端收到加密的網頁,用自身的對稱密鑰解密,就能得到網頁的內容了。

(10)TCP四次揮手,通訊結束。

5、openssl自建CA過程詳解

OpenSSL是套開放源代碼的軟件庫包,實現了SSL與TLS協議。其主要是以C語言所寫成,實現了基本的加密功能。

OpenSSL能夠運行在絕大多數類Unix操做系統上(包括Solaris,Linux,Mac OS X與各類版本的開放源代碼BSD操做系統),OpenVMS與Microsoft Windows。它也提供了一個移植版本,能夠在IBM i(OS/400)上運做。

此軟件是以Eric Young以及Tim Hudson兩人所寫的SSLeay爲基礎所發展的,SSLeay隨着兩人前往RSA公司任職而中止開發。

雖然此軟件是開放源代碼的,但其受權書條款與GPL有衝突之處,故GPL軟件使用OpenSSL時(如Wget)必須對OpenSSL給予例外。

openssl創建私有CA的詳細過程以下:

openssl建立私有CA的過程:

前提:

安裝openssl :# yum install openssl

image

一、創建CA服務器:

(1)生成密鑰

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

image

命令解釋

()表示將會在當前shell中新建一個子shell,將()中的命令放到該子shell中執行,執行完畢後關閉子shell並回到當前shell。

因爲要對生成的cakey.pem文件設置合適權限,可以使用umask修改文件的默認權限設置。爲了避免影響當前shell的默認權限設置,使用()將這些命令放到子shell中執行就好了!

genrsa  : 指定使用rsa算法生成私鑰

-out :指定生成的私鑰的存放位置(注意:該存放位置是在配置文件中默認定義了的,路徑和文件名不能隨意修改!!!)

2048 :指定生成一個2048位的私鑰

(2)自簽證書

# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655

image

命令解釋:

req: 生成證書籤署請求

-news: 新請求

-key /path/to/keyfile: 指定私鑰文件(req命令能根據私鑰自動抽取出公鑰)

-out /path/to/somefile: (注意:路徑和文件名不用隨意修改!)

-x509: 專門用於生成自簽署證書

-days n: 有效天數(通常和-x509一塊兒使用纔有意義。)

(3)初始化工做環境(只有第一次建立CA時,才須要初始化工做環境)

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

# echo 01 > /etc/pki/CA/serial   (指定序列號從那個數字開始)

image

二、節點申請證書:

(1) 節點生成請求

image

a、生成密鑰對兒

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

image

b、生成證書籤署請求

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

image

-csr :證書籤署請求,通常都是這樣的後綴

c、把簽署請求文件發送給CA服務

(2) CA簽署證書

a、驗正證書中的信息;

b、簽署證書

# openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days N

[root@localhost CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 1000     
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: Jul  3 14:07:23 2014 GMT     
            Not After : Mar 29 14:07:23 2017 GMT     
        Subject:     
            countryName               = CN      #國家名
            stateOrProvinceName       = GuangDong   #省份名  
            organizationName          = 51CTOblog   #公司名
            organizationalUnitName    = Ops         #部門名
            commonName                = www.hjqjk.com   #主機名  
            emailAddress              = hjqjk@163.com   #郵箱  
        X509v3 extensions:     
            X509v3 Basic Constraints:      
                CA:FALSE     
            Netscape Comment:      
                OpenSSL Generated Certificate     
            X509v3 Subject Key Identifier:      
                F9:DB:00:04:8A:D7:17:C8:21:B7:2D:15:F2:E9:89:66:BB:6D:D5:F9     
            X509v3 Authority Key Identifier:      
                keyid:98:56:B3:30:B0:9D:75:A1:69:AD:BF:2F:E4:0D:FE:3F:17:87:B0:A8
Certificate is to be certified until Mar 29 14:07:23 2017 GMT (1000 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@localhost CA]# ls /etc/httpd/ssl      #證書已簽署,自建CA到這裏就成功了
httpd.crt  httpd.csr  httpd.key

c、發送給請求者;

以後,只要把簽署的證書發回給申請者就好了!

相關文章
相關標籤/搜索