1. 程式人生 > 實用技巧 >安全加密與證書籤發工具--openssl

安全加密與證書籤發工具--openssl

寫在前面:

部落格書寫牢記5W1H法則:What,Why,When,Where,Who,How。


本篇主要內容:

● 安全協議

● 資料安全問題及解決方案

● 金鑰演算法及通訊過程

● 使用OpenSSL命令列工具建立私有CA、簽發證書、維護crl證書吊銷列表



回顧:

資源子網:關注資料包組成(應用軟體)

通訊子網:關注資料傳輸過程(linux核心來實現)

TCP/IP:

應用層協議:http/ftp...

傳輸層協議:tcp/udp/sctp

網際網路層協議:ipv4/ipv6

物理層:ppp,乙太網

主機通訊:

本機不同程序:IPC,message queue,shm,semerphor

不同主機程序

socket(是由成對的IP:port組成的,client IP:port <--> Server IP:port)

不同主機通訊需要先連線到port,進而找到通訊程序,所以port是被程序獨佔的。程序使用埠需向核心註冊使用。

不同主機通訊,服務端埠必須一直處於監聽(listen)狀態以供客戶端訪問。而客戶端通過約定俗成來找到常見服務的埠(如http服務的80埠,訪問時不必明確指出);通過DNS服務來找到服務端IP地址。

埠分配:

1-1024:系統服務佔用(如80、22、21、)

< 4W :半隨機,有一些不太常見的服務佔用(mysql 3306,oracle 1521)

> 4W :隨機

安全協議:

SSLSecure Sockets Layer(安全套接字層)

版本:V1.0 V2.0 V3.0(現用)

TLSTransport Layer Security(傳輸層安全)

IETF:1999年

V1.0 V1.1 V1.2(現用) V1.3

SSL、TLS協議分層設計

1、最底層:基礎演算法原語的實現,aes, rsa, md5

2、向上一層:各種演算法的實現;

3、再向上一層:組合演算法實現的半成品;

4、用各種元件拼裝而成的各種成品密碼學協議軟體;

SSL、TLS協議是一個公共功能庫,在傳輸層與應用層之間的半層。當應用程式呼叫時使用,不呼叫則不使用。

如:http服務呼叫SSL或TLS功能庫之後,就轉換成了安全的https服務了。

wKioL1cGgK2Q3YzmAAAJnIBxp2c567.png



安全的目標:

保密性:confidentiality

完整性:integrity

可用性:availability

***型別;

威脅保密性:竊聽、通訊量分析

威脅完整性:更改、偽裝、重放、否認(通訊中的一方)

威脅可用性:拒絕服務(DoS)

解決方案:

(1)技術上:

加密解密:

使用某種演算法得到非明文資訊,而參與演算法的一串字元即為密碼。

傳統加密方法:

替代加密演算法、置換加密演算法

現代加密方法:

現代塊加密方法:

將整個資料分割成多個塊,單獨進行加密,進行復雜的運算,使得必須得到全部資料和密碼才能夠解密。

(2)服務:

使用安全服務,可抵禦***的服務。

認證機制

訪問控制機制

金鑰演算法和協議


金鑰演算法和協議

為了解決加密解密傳輸過程中,密碼交換過程的安全的服務。

對稱加密:

特點:

(1) 加密解密使用同一個金鑰

(2) 將原始資料分隔成為固定大小的塊,逐個進行加密

缺陷:

(1) 金鑰過多(對伺服器端來說,會產生大量金鑰)

(2) 金鑰分發困難

常用演算法:

DES:Data Encryption Standard(已不安全)

3DES:Triple DES(64bits)

AES:Advanced Encryption Standard(128bis、192bits、256bits、384bits)

Blowfish

Twofish

IDEA

RC6

CAST5

非對稱加密

特點:

成對出現公鑰和私鑰;

公鑰加密,必須用私鑰解密;

私鑰加密,必須用公鑰解密。

公鑰:

從私鑰中提取產生,可公開給所有人,pubkey。

私鑰:

通過工具建立,使用者留存,必須保證私密性,secret key。

用途:

數字簽名:

私鑰加密,公鑰解密。用於使接收方確認傳送方身份。

金鑰交換IKE(Internet Key Exchange):

公鑰加密,私鑰解密。傳送方使用對方公鑰加密一個對稱加密金鑰,併發送給對方。

金鑰交換也可以使用DH(Deffie-Hellman)來實現

資料加密:

常用演算法:

RSA:可用於簽名和加解密

DSA:僅簽名

ELGamal

非對稱加密方式通訊過程:

wKioL1cGga-wkr-aAAA-dYmKcsA643.png


單向加密

特徵:

提取資料指紋。只能加密,不能解密

定長輸出

雪崩效應。初始結果的微小改變導致結果的巨大變化

功能:

完整性驗證

常用演算法:

md5:Message Digest 5,128bits定長輸出

sha1:Secure Hash Algorithm 1,160bits定長輸出,即40個字母數字的組合

sha224/sha256/sha384/sha512

認證協議

金鑰交換

常用演算法:

RSA

公鑰加密

DH

此演算法通過隨機大質數的數學演算法得到,不會將密碼在網際網路上傳送,比公鑰加密的方式更具優勢。

ECDH(橢圓曲線DH)

ECDHE(臨時橢圓曲線DH)

CA:

非對稱加密的過程中,由於通訊雙方互不認識,為了正確的獲得對方的公鑰,防止中間人***,我們需要一個雙方都認可的第三方來認證,而這個第三方就是CA。

CA為通訊雙方簽發證書(證書中含有公鑰),為雙方身份提供擔保。


PKI:Public Key Infrastructure

即公鑰基礎設施

組成部分:

簽證機構:CA

註冊機構:RA

證書吊銷列表:CRL

證書存取庫:

X.509v3

定義了證書結構及認證協議標準

版本號:X.509目前有3個版本,最多用的是v3版本

序列號:本章證書是CA簽發的第多少張證書

簽名演算法ID:數字簽名中單向加密所使用的演算法

發行者名稱:CA的名稱

有效期限

主體名稱

主體公鑰

發行者的唯一標識

主體的唯一標識

擴充套件資訊

發行者簽名


SSL會話步驟:

(1) 客戶端向伺服器端索要並驗證證書;

(2) 雙方協商生成“會話金鑰”;

(3) 雙方採用“會話金鑰”進行加密通訊;

其中1、2步驟為握手階段(Handshake)

SSL Handshake Protocol:

第一階段:ClientHello:

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

客戶端生成一個隨機數,稍後使用者生成“會話金鑰”

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

支援的壓縮演算法;

第二階段:ServerHello

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

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

確認使用的加密方法;

伺服器證書;

第三階段:

驗正伺服器證書,在確認無誤後取出其公鑰;(發證機構、證書完整性、證書持有者、證書有效期、吊銷列表)

傳送以下資訊給伺服器端:

一個隨機數;

編碼變更通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送;

客戶端握手結束通知;

第四階段:

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

向客戶端傳送如下資訊:

編碼變更通知,表示隨後的資訊都將用雙方商定的加密方法和金鑰傳送;

服務端握手結束通知;


linux系統上金鑰演算法和協議的實現工具:

GPG(pgp)

OpenSSL(ssl)

組成:

libencrypto:庫,加密解密演算法的實現

libssl:庫,SSL半層功能庫的實現,用於通訊

openssl:命令列工具


openssl命令列工具實現金鑰演算法與協議:

openssl

子命令:

標準命令

enc, ca, req, genrsa, ...

訊息摘要命令

dgst子命令

加密命令

enc子命令

實現對稱加密:

工具:openssl enc

其他工具:gpg

支援的演算法:3des, aes, blowfish, towfish

enc命令:

加密

~]# openssl enc -e -des3 -a -salt -in FILE -out FILE_AFTER_ENC

解密

~]# openssl enc -d -des3 -a -salt -out FILE -in FILE_AFTER_ENC

實現單向加密:

工具:openssl dgst

其他工具:md5sum, sha1sum, sha224sum, ...

dgst命令:

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

生成使用者密碼:

工具:openssl passwd

其他命令:passwd命令

命令:

~]# openssl passwd -1 -salt SALT

生成隨機數

工具:openssl rand

命令:

~]# openssl rand -hex NUM

~]# openssl rand -base NUM

公鑰加密:

加密解密:

演算法:RSA,ELGamal

工具:openssl rsautl, gpg

數字簽名:

演算法:RSA, DSA, ELGamal

工具:openssl rsautl, gpg

金鑰交換:

演算法:DH

生成金鑰對:

生成私鑰:

~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)

NUM_BITS為2的n次方

提出公鑰:

~]# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout

建立私有CA:

工具:openssl、OpenCA

配置檔案/etc/pki/tls/openssl.cnf

定義了證書目錄、序列號檔案、資料庫檔案等等

目標:

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

步驟:

(1) 生成私鑰;

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

檔名應與配置檔案中保持一致。

(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;

生成過程需要輸入一些資訊:

國家程式碼,省、城市、公司名、部門名、主機名、Email

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

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

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

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

serial為序列號儲存檔案,“01”將作為第一個CA簽發的證書的序列號,檔案為空時不能正確簽發證書。


其他需安全通訊的伺服器向CA請求籤發證書:

步驟:(以httpd為例)

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

~]# mkdir /etc/httpd/ssl

~]# cd /etc/httpd/ssl

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

(2) 生成證書籤署請求

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

注意:這裡填寫的資訊應該與CA證書保持一致,主機名必須與外界訪問的域名相同。

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

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

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

檢視證書中的資訊:

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

(5) 將證書通過可靠方式發回給請求主機


吊銷證書:

步驟:

(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


轉載於:https://blog.51cto.com/1036416056/1761565