加密解密技術基礎、PKI及創建私有CA

目錄

    一、數據安全的基本特點

    二、數據的加密算法和協議  

    三、數字證書CA

    四、PKI概述

    五、OpenSSL的組成

    六、使用OpenSSL構建私有CA




一、數據安全的基本特點   

        保密性:confidentiality;保證數據不被其他非法用戶所獲得

        完整性:integrity(數據完整性和系統完整性)

        可用性:available 保證數據能夠被用戶實時調用及查看


二、數據的加密算法和協議

    1.加密或解密的方法:

            傳統加密方法:

                    替代加密算法

                    置換加密方法

            現代加密方法:

                現代塊加密方法:把數據切割爲固定大小的塊,分別對每塊數據進行單獨加密,後一塊和前一塊基於某種鏈式機制,進行某種特殊的運算,緊密聯繫在一起。

    2.加密算法和協議:

    (1)對稱加密:加密和解密使用同一個密鑰。

           加密過程:(圖片僅幫助理解)

wKiom1aOJD6RhSbOAADrREOa4ps132.jpg

    常見的算法

          DES:Data Encryptionstandard(數據加密標準) 現代加密算法,它使用56位的密鑰對數據進行加密。

          3DES:Triple DES(相當於DES三個數量級)現代加密算法,它使用3條56位的密鑰對數據進行三次加密。

          AES:AdvancedEncryption Standard(高級加密標準)AES加密數據塊分組長度必須爲128比特,密鑰長度可以是128比特、192比特、256比特中的任意一個(如果數據塊及密鑰長度不足時,會補齊)。 

          商業加密算法:Blowfish,IDEA,RC6,CASTS

     特性:

           ● 加密、解密使用同一個密鑰;

           ● 將原始數據分割成爲固定大小的塊,逐個進行加密;

    (2)公鑰加密:密鑰分爲公鑰和私鑰(成對出現)

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

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

            特點:用公鑰加密的數據,只能使用與之配對兒的私鑰解密;

            用途:

                  數字簽名:主要在於讓接收方確認發送方的身份。

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

                  身份認證:發送方用自己的私鑰加密數據特徵碼,接收方用對方的公鑰進行解密。依賴數               字簽名,發送方用自己的私鑰加密數據特徵碼的結果就是數字簽名。數字簽名就是爲了完成身               份認證的。

            公鑰加密通信過程:

                發送方

                        單向加密,計算數據的特徵碼

                        用自己的私鑰加密特徵碼,並將結果附加在數據後,

                        生成一個臨時的對稱密鑰,並用對稱密鑰加密整段數據

                        獲取對方公鑰,並使用對方公鑰,加密臨時對稱密鑰,並附加在數據後,發送給對方

                接收方:

                        使用自己的私鑰解密加密的對稱密鑰

                        用對稱密鑰解密加密的數據

                        用對方的公鑰解密特徵碼,如果能解密,對方身份得到驗證

                        用單向加密計算數據的特徵碼與源文件進行比較,數據完整性得到驗證     

            算法:

                    RSA,DSA,ELGamal(商業加密算法);

                    DSS : Digtal Signature Standard(數字簽名標準)

                        只能簽名不能加解密

                    DSA:DigtalSignatute Algorithm(數字簽名算法)既能簽名又能加解密,功能強大

     (3)單向加密:即提取數據指紋(即特徵碼),只能加密,不能解密;

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

        功能:完整性驗證

        算法:

            MD5:Message Digest5(消息摘要), 128bits

            sha1 160bits, sha224, sha256, sha384, sha512

    (4)密鑰交換:IKE ( Internet Key Exchange )

        常見的實現方法:

            公鑰加密

            DH(Deffie-Hellman)算法

      

三、數字證書CA

      公鑰在網絡傳輸過程中,無法保證可信度,容易被竊取或僞裝,所以我們就需要一個受信任的第三方機構(CA),來保證公鑰信息的安全分發。

    1.數字證書CA的頒發

       用戶首先產生自己的密鑰對,並將公共密鑰及部分個人身份信息傳送給認證中心。認證中心在覈實身份後,將執行一些必要的步驟,以確信請求確實由用戶發送而來,然後,認證中心將發給用戶一個數字證書,該證書內包含用戶的個人信息和他的公鑰信息,同時還附有認證中心的簽名信息。用戶就可以使用自己的數字證書進行相關的各種活動。

    2.如何對對方的數字證書進行驗證

      用戶使用CA 的公鑰對那個證書上的簽字進行驗證,一旦驗證通過,該證書就被認爲是有效的。證書實際是由證書籤證機關(CA)簽發的對用戶的公鑰的認證。

    3.證書驗證的主要內容:

       用戶先獲得CA自己的證書,用CA的公鑰解密CA的證書,驗證CA的可靠性,CA的證書是由CA自己所頒發的。 

    (1)用戶使用CA的公鑰解密對方的證書,能解密說明證書來源可靠;

    (2)然後用同樣的加密算法加密證書,取得特徵碼,與解密的特徵碼比較,如果相同,證書完整性可靠;

    (3)檢查證書的有效期限;

    (4)驗證主體名稱和期望通信的對方是否一致;

    (5)檢查證書是否被吊銷。

至此,證書驗證過程結束。

       

四、PKI : Public Key Infrastructure

        公鑰基礎設施:

        簽證機構:CA 用戶在註冊機構註冊以後,CA判明申請者的身份後,便爲他分配一個公鑰,並且 CA 將該公鑰與申請者的身份信息綁在一起,併爲之簽字後,便形成證書發給申請者,並在證書存取庫進行備份。

        註冊機構:RA,一般用戶在註冊CA時的註冊機構。

        證書吊銷列表:CRL,用戶如果將自己的私鑰丟失,就可以申請吊銷自己的證書。

        證書存取庫:CB,發出證書的存放的數據庫,如果用戶的證書丟失,可以在這兒找到。

        x509V3:定義了證書的結構以及認證協議標準

            版本號:指出該證書使用了哪種版本的X.509標準

            序列號:由CA給予每一個證書分配的唯一的數字型編號

            簽名算法ID:用來指定CA簽署證書時所使用的簽名算法

            發行者名稱:CA的名稱

            有效期限:證書起始日期和時間以及終止日期和時間

            主體名稱:證書持有人唯一的標識符

            主題公鑰:包括證書持有人的公鑰、算法

            發行者的唯一標識(可選項)

            主體的唯一標識(可選項)

            擴展

            發行者的簽名:CA對此證書的數字簽名,用於驗證證書是自己的簽發的


五、OpenSSL的組成

 1.OpenSLL協議工作原理

    (1)在TCP/IP協議下的實現過程

    wKiom1aOhZmxfX74AAEHdiq4AsE624.jpg

     (2)客戶端和服務器端的會話原理(圖片未必精確,輔助理解)

    wKiom1aPyoaD-sTcAAGkZ83inLo818.jpg

 SSL客戶端服務器端會話過程:

       客戶端生成一個隨機數,稍後用戶生成“會話密鑰“,客戶端支持的加密算法,比如AES,RSA以及

支持的壓縮算法。

       服務器端生生一個隨機數,稍後用於生成“會話密鑰”,雙方協商通信所使用的加密算法,服務器

端向客戶端發送服務器端的證書

       客戶端驗證服務器證書(發證機構,證書完整性、證書持有者、證書有效期、吊銷列表)在確認無

誤後取出其公鑰;發送一個隨機數,編碼變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰

發送;至此客戶端握手結束通知;

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

鑰“,向客戶端發送變更通知,表示隨後的信息都將用雙方商定的加密方法和密鑰發送;服務端握手結

束通知;


2.OpenSSL支持的子命令

    標準命令:enc,ca,req,genrsa,...

Standard commands  
#標準命令,使用命令自身來調用
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              
Message Digest commands (see the `dgst' command for more details) 
#消息摘要命令,使用dgst調用,加密時支持的算法
md2               md4               md5               rmd160            
sha               sha1              
Cipher commands (see the `enc' command for more details)
#加密命令,使用enc命令調用
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib

    對稱加密:

        工具: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 openssl dgst, md5sum, sha1sum, sha224sum, ...

    dgst命令:      

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

    生成用戶密碼:

        工具:passwd, openssl  passwd

 ~]# openssl  passwd  -1 -salt  SALT

        生成隨機數:

        openssl rand       

 ~]# opensll rand -hex NUM
 ~]# opensll rand -base NUM

    公鑰加密:

            加密解密:

            算法:RSA,ELGamal

            工具:openssl rsautl, gpg

    數字簽名:

        算法:RSA, DSA, ELGamal

        工具:penssl rsautl, gpg

    密鑰交換:

        算法:DH    

  生成私鑰: ~]# (umask 077;  openssl genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)
  提出公鑰: ~]# openssl  rsa  -in /PATH/FROM/PRIVATE_KEY_FILE -pubout

3.如何使用OpenSSL進行對稱加密

    (1) 對稱加密

示例:解密解密當前目錄下的anaconda-ks.cfg文件

[root@localhost ~]# cp /etc/fstab ./  #將/etc/fstab文件複製至當前目錄下
[root@localhost ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.cipher #加密操作
enter des-ede3-cbc encryption password: #加密是用到的密碼
Verifying - enter des-ede3-cbc encryption password:
[root@localhost ~]# cat fstab.cipher  #查看加密後的文件
U2FsdGVkX19vosbARtM7zk0M+f8c+StIW8TR7mOLAQoc30fhhXF9gGYjiRT4Uzou
Qq9B/SSoHP/jbC9PiLiMRNxktyFkCqOPMyql5W2SumcxD4bSPKy0MHpKs8UP//LZ
JODM4ImWvXIY+qjmeV52j4j75BKPIwMEVSLsbjMBVI8IEDmVMi6T8z78GJFpKZpW
DMKcR6S1oarHdCnrrPFAKYyUr2N3qjuY8eGrce7cxpG9NrqvIgGG9yvWHodlUa0Y
C5T8ZNMrLokdV/5Rd0jJOuykvxHSPsvUI1S3jYojAsU4S5H3IAeSW/3OkGIW8dr1
GLL/Gjxk+irQI+BxepKqtHU9coxTKzZhE7FdSNYzsAWXfm2DoPa9z4YPafvMqMHu
lN6ra6daLNERZdwr5rDvEn19q7Swcqd9mOlwVpk4W7X4gxeSbFp2/orm9BFDdmNV
aeXaKQjEsZiA/sc1V8TbHY66bzyvDay9DIXSVaYAhBrZV2Kkxrv7GCV/PrOeVLkN
2UR9i6rZrHvJyQA2UJqPzIEOYHI3hV0inJVyzsOOIJoOKEdnlaxktPb0mbeoeb7C
Kf/Pr2r3ToUFwjb2WKhVe+nJCKsL2b5TRptEiHJaxzhQDdg7kv3AsoqIO/X8PzUV
IOr5jG/2zyDKh8a2uLODXBSYEtMLTqw7709ZMntFY8Mh0tVdWI8ygTfre6gmPqij
chHEDj7fEUa4o/jKF+x5s0pWE8XpUaktucz45fOFl5SoOHbL8x25gaqEAfAhSax8
OsWETzvML0kCf/dcUZixb3MBkaTHdUZIozbjVmNtJJa4lqPxbxoQig==

解密加密後的文件

六、使用OpenSSL構建私有CA

    注:此處申請CA的服務器和CA主機是分別爲兩臺CentOS 7主機

1.建立私有CA:
            Openssl
            OpenCA

    openssl命令配置文件: /etc/pki/tls/openssl.cnf

#這裏只列出CA默認的經常用到的部分
[CA_default ]
dir        = /etc/pki/CA                   # Where everything is kept
certs        = $dir/certs                    # Where the issued certs are kept
crl_dir        = $dir/crl                    # Where the issued crl are kept
database    = $dir/index.txt        # database index file.
#unique_subject    = no                # Set to 'no' to allow creation of
                                                        # several ctificates with same subject.
new_certs_dir    = $dir/newcerts    # default place for new certs.
certificate    = $dir/cacert.pem      # The CA certificate
serial        = $dir/serial                   # The current serial number
crlnumber    = $dir/crlnumber       # the current crl number
                                                        # must be commented out to leave a V1 CRL
crl        = $dir/crl.pem                    # The current CRL
private_key    = $dir/private/cakey.pem  # The private key
RANDFILE    = $dir/private/.rand                 # private random number file


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

    步驟:

        (1) 生成私鑰

[root@localhost ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
..........................................++
..................................................................................................................++
e is 65537 (0x10001)
[root@localhost ~]# ls -l /etc/pki/CA/private/cakey.pem   #查看文件權限確保不能被他人訪問
-rw-------. 1 root root 3243 1月   5 01:57 /etc/pki/CA/private/cakey.pem

        (2)生成自簽證書

[root@localhost ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
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) []:Beijing        
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:CTO
Organizational Unit Name (eg, section) []:technology
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:[email protected]

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

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

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

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

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

     (3)爲CA提供目錄和文件

 [root@localhost ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts} #創建CA所需要的目錄
 [root@localhost ~]# touch /etc/pki/CA/{serial,index.txt} #創建CA需要的文件存儲序列號和索引文件
 [root@localhost ~]# echo 01 > /etc/pki/CA/serial #將序列號定向輸出至serial文件中

要用到證書進行安全通信的節點服務器,需要向CA請求籤署證書(以httpd爲例)

  步驟:
    (1) 用到證書的主機生成私鑰,首先確保當前主機已經安裝了httpd服務

[root@localhost ~]# rpm -q httpd #查看當前主機是否安裝httpd服務
httpd-2.2.15-45.el6.centos.x86_64
[root@localhost ~]# cd /etc/httpd/
[root@localhost httpd]# mkdir ssl
[root@localhost httpd]# cd ssl/
[root@localhost ssl]# (umask 077; openssl genrsa -out httpd.key 2048) #生成私鑰

    (2) 生成證書籤署請求

[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr -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  #填寫申請簽署的信息,此處務必和CA主機的信息一致
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:CTO
Organizational Unit Name (eg, section) []:technology
Common Name (eg, your name or your server's hostname) []:localhost #此處的主機名爲服務器域名
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# ll #使用ll命令可以看到當前目錄下生成了一個httpd.csr的文件
total 8
-rw-r--r-- 1 root root 1005 Jan  4 17:36 httpd.csr
-rw------- 1 root root 1675 Jan  4 17:35 httpd.key

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

    使用scp命令將該文件傳輸至CA主機

    注:scp(Security  copy)是在Linux下進行遠程拷貝文件的命令,基於ssh登錄

[root@localhost ssl]# scp httpd.csr [email protected]:./ #爲了方便此處將文件傳輸至當前目錄
The authenticity of host '172.16.249.123 (172.16.249.123)' can't be established.
RSA key fingerprint is 75:3e:1f:63:a9:e0:ba:c1:2b:f9:f3:28:75:d7:26:0a.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '172.16.249.123' (RSA) to the list of known hosts.
[email protected]'s password: 
httpd.csr                                              100% 1005     1.0KB/s   00:00

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

[root@localhost ~]# openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.ctr -days 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: Jan  4 18:45:20 2016 GMT
            Not After : Jan  3 18:45:20 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Beijing
            organizationName          = CTO
            organizationalUnitName    = technology
            commonName                = localhost
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                B6:47:E9:94:5D:B0:4E:27:A4:C4:D6:F7:71:0C:E7:E5:69:34:92:F6
            X509v3 Authority Key Identifier: 
                keyid:24:52:08:3D:06:76:BB:96:83:91:2A:22:9C:4D:D8:FB:3B:36:BC:58
Certificate is to be certified until Jan  3 18:45:20 2017 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

    (5)頒發證書給節點服務器

[root@localhost ~]# scp /etc/pki/CA/certs/httpd.ctr [email protected]:/etc/httpd/ssl/

    至此,CA證書籤發完成。

3.吊銷CA證書

    僅作測試使用,在真實的生產環境很少用到。

    (1) 客戶端獲取要吊銷的證書的serial(在使用證書的主機執行):
       ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
    (2) CA主機吊銷證書
      先根據客戶提交的serial和subject信息,對比其與本機數據庫index.txt中存儲的是否一致;  
      吊銷:
       ~]# openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem          
             其中的SERIAL要換成證書真正的序列號;   

        示例       
    (3) 生成吊銷證書的吊銷編號(第一次吊銷證書時執行)
             # echo  01  > /etc/pki/CA/crlnumber
    (4) 更新證書吊銷列表
             # openssl  ca  -gencrl  -out  thisca.crl
          查看crl文件:
             # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text


    以上爲簽署私有CA及吊銷CA的全過程,難免有不足之處,懇請大家多多指正。


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