天天看點

加解密技術基礎

一、SSL協定

    現代資訊流通中web占了巨大的一部分,但是實際上web除了https協定支援的web伺服器,資訊對外都是透明的,現在流行的https全棧設計就是要擺脫資訊洩漏的危險。傳統的服務如http都是成熟已久的服務,為了減少不必要的麻煩,SSL(Secure Socket Layer)協定就應運而生了--在TCP/IP的應用層和網絡層之間添加協定SSL子層(如下圖),程式員調用協定子層協定實作資料加密和傳輸。

加解密技術基礎
二、SSL協定會話會話過程
加解密技術基礎

三、openssl基礎

    單向加密:隻能加密,不能解密。

        工具:openssl dgest,mdsum,sha1sum,sha224sum等等

        dgst指令:單向加密可以標明加密方法

openssl dgst -md5 /tmp/fstab MD5(/tmp/fstab)= 85301c14005a7d9eae19ddfc3475131d# md5sum /tmp/fstab 85301c14005a7d9eae19ddfc3475131d  /tmp/fstab      

    公鑰加密:三種功能:加密解密,密鑰傳送,數字認證

1加密解密:

    算法:RSA,ELGamal

    工具:openssl,rsautl,gpg

2.數字簽名:

    算法:RSA,DSA,ELGamal

3.密鑰交換:

    算法:DH

    生成密鑰:

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

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

# (umask 077;openssl genrsa -out /tmp/a.private  1024) 
Generating RSA private key, 1024 bit long modulus...........................................................++++++....................++++++e is 65537 (0x10001)
# cat /tmp/a.pr 
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC5cLbUjCv9MELyHAndxltipdmvvtnMem6E9JZ7ymifMnggFHwbcRO3q03S6pTbdDKaBnMRulw9OQdvCOexm3Ym9P1jNLM6vNgGnROyWxWUoXZWd/YRG4WP0Lo2yvTdzXkNAwFL9S0wZTKfsFI3FYtV/432XA5vuI3olwgG8IJWhwIDAQABAoGBAKFf/TsqYH2NKjUXQV7F53EJc08FfvP694KsduhzVGh1uyPvr7ERzl7frHIHwlLX49E2G50p2GtO3bE6xqZA66euq8W4TefCVmKZm2P3c2Aj6HuRhVyKkFdZ7bZSjYDtGYjksTlzmHzC8g6Wzs3B3AHifuNU8oazqxINPObz5hABAkEA7P9oSBfhu8wm42r95UFqxWlwSRaYHyWSN4KQyM6IIWzjGFTSt4+DX4AUDGc9PpoB4l2HcnRctdU/RHn/54DxhwJBAMhPC2NzmGtiG1XW0uYfCXjmqF+iU79zQ/ikfVJRoEfZN4jPdTurCFxssbyQSJYnWxZTtM+4eS6F7mlKUabgswECQQDYwfB6n30R6fJXZW+50k75JypPbp7LPe2xX3VUc7EGATTi+BGRWWzqV5X+kh3tt6Wph6luAQcaN2OaGYr4DXLZAkBwVfQbGC74uhJ+d3XbXLihNypiR9UT337VKNqnmeN7p9Q/Q6mJhwevXb3n9DrhCr1IrjUO8XP0pWPpZKaaIhYBAkEAja39oNrqbvmBbmaanMfACTkf9CTgpjbfau63lArey1e0QJRz8I4wOZA/EEm9twvvNyYnUiiDJbTIwuY7xHwTyA==-----END RSA PRIVATE KEY----- # openssl rsa -in  /tmp/a.private  -puboutwriting RSA key-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5cLbUjCv9MELyHAndxltipdmvvtnMem6E9JZ7ymifMnggFHwbcRO3q03S6pTbdDKaBnMRulw9OQdvCOexm3Ym9P1jNLM6vNgGnROyWxWUoXZWd/YRG4WP0Lo2yvTdzXkNAwFL9S0wZTKfsFI3FYtV/432XA5vuI3olwgG8IJWhwIDAQAB
-----END PUBLIC KEY-----      

 Linux系統上的随機數生成器

    /dev/random:僅從熵池傳回随機數;随機數用盡,阻塞;

    /dev/urandom:從熵池傳回随機數;随機數用盡,會利用軟體生成僞随機數,非阻塞;

    僞随機數不安全;

    熵池中随機數的來源:

        硬碟IO中斷時間間隔;複制大檔案到磁盤會有大量磁盤IO中斷

        鍵盤IO中斷時間間隔;

五、 CA

     CA分為公共信任的CA,私有CA兩種,公有CA是外部機建構立的,申請即可,費用也不低。私有CA範圍有限,可以在公司内部建立,當然隻能在公司内部使用,因為你的證書别人并不認可,缺乏權威。

    搭建私有CA:以下兩種實作

        openssl

        OpenCA:開源CA

這裡講解openssl搭建私有CA:

    openssl指令:

        openssl的配置檔案:/etc/pki/tls/openssl.cnf ;其中部配置設定置定義了CA的配置。

        [ca]段定義ca特性:ca怎麼管理ca,ca 工作環境

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.各個已經頒發的證書索引,包含序列号
new_certs_dir    = $dir/newcerts          # default place for new certs.對應certs目錄中的證書的
SERIAL.crtserial = $dir/serial            # 用于為ca提供證書序列号存儲位置
certificate      = $dir/cacert.pem        # 指定CA 自簽證書
private_key      = $dir/private/cakey.pem # The private key.CA自身私鑰
default_days     = 365                    # 預設的證書有效期      

        [req]段是request請求配置段,需要的認證機關個人向CA發出注冊簽署請求,這裡定義怎麼生成配置請求。

    在确定配置為CA的服務上生成一個自簽證書,并為CA提供所需要的目錄及檔案即可:

    步驟:

        (1)生成私鑰;

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

        (2)生成自簽證書;man req即可

            ~]#openssl  req  -new  -x509  -key  /etc/pki/CA/private/cakey.pem  -out  /etc/pki/CA/cacert.pem -days 3655 #指令自動抽取公鑰再生成req,在簽署過程中生成公鑰。證書申請填寫的是組織資訊。

# openssl req -key  -new -x509 /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
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]:MagEdu   # 私建CA,那麼用于公司内部,就用公司名
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.magedu.com   #要伺服器或主機名字
Email Address []:[email protected]
# ls /etc/pki/CA/cacert.pem
/etc/pki/CA/cacert.pem
[root@centos7 ~]# ls /etc/pki/CA/cacert.pem -al
-rw-r--r--. 1 root root 2065 4月   7 02:06 /etc/pki/CA/cacert.pem      

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

            -x509:生成自簽格式證書,專用于建立私有CA時;不是自簽就不要加了,自動簽署證書;

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

            -out:生成的請求csr檔案路徑;如果自簽操作将直接生成簽署過的證書;

            -days:證書的有效時長,機關是day;

        (3)為CA提供所需的目錄及檔案;

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

            ~]#touch /etc/pki/CA/{serial,index.txt} #序列号,資料庫檔案

            ~]#echo 01 > /etc/pki/CA/serial # 給定一個需要起始号碼

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

步驟:(以httpd為例,前三步驟在請求主機上做,第四步在CA主機上做)

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

        ~]#mkdir /etc/httpd/ssl

        ~]#cd /etc/httpd/ssl

        ~]#(umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)#不要在CA配置目錄下建立,那是作為CA主機并自建CA才用到的路徑。

    (2)生成證書簽署請求

        ~]#openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365 # 不要寫-x509

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

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

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

        ~]#cat /etc/pki/CA/index.txt 

#cat /etc/pki/CA/index.txt 
 V     170105083250Z   01 unknown /C=CN/ST=Beijing/U=Magedu/OU=Ops/CN=www.magedu/[email protected]      

    主識标标:

/C=CN/ST=Beijing/U=Magedu/OU=Ops/CN=www.magedu/[email protected]

檢視證書中的資訊:

        ~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject # 隻顯示serial subject

    吊銷證書:

步驟:

    (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)更新證書吊銷清單