OpenSSL gen RSA-des 3-out host . key 2048
生成頒發機構密鑰
OpenSSL req-new-x509-days 7305-key host . key-out host . CRT
生成用於頒發的證書
openssl genrsa -des3 -out應用程序. pem 1024
請求認證的公司生成私鑰。
OpenSSL RSA-in applier . PEM-out applier . key
生成與applier.pem對應的解密密鑰applier.key
OpenSSL req-new-key applier . PEM-out applier . CSR
請求認證的證書申請
OpenSSL ca-policy policy _ any-days 1460-cert host . CRT-keyfile host . key-in applier . CSR-out applier . CRT
Ca簽署applier.csr並頒發證書applier.crt
//認證環境
mkdir -p CA/newcerts
觸摸CA/index.txt
觸摸CA/serial
echo "01 " >CA/序列
2臺Nginx的配置
服務器{
Listen 443 ssl default _ server
索引index.html index.htm;
位置/ {
根目錄/根目錄
}
Ssl開啟
SSL _ certificate/path/applier . CRT?#提供證書
SSL _ certificate _ key/path/applier . key?#提供解密私鑰
}
直接通過https協議訪問localhost時,瀏覽器會和服務器握手,收到壹個證書消息。由於實驗中使用的是自簽名證書,瀏覽器會提示該證書不可信,妳可以通過將該證書添加到exception來訪問。服務器發送給客戶端的證書消息包含服務器證書的公鑰;收到消息段後,客戶端從消息段的相應位置讀取服務器證書的公鑰,並根據協議將其存儲在相關變量中。
與網站建立SSL安全連接時使用https協議,即使用https://ip:port/進行訪問。瀏覽器和Web服務器之間有壹個握手過程來完成認證和密鑰交換,從而建立安全連接。具體流程如下:
1用戶瀏覽器向服務器發送其SSL會話號、加密設置參數、會話相關數據和其他必要信息。
服務器將其SSL版本號、加密設置參數、會話相關數據和其他必要信息發送給瀏覽器,還將服務器的證書發送給瀏覽器。如果配置服務器的SSL需要驗證用戶的身份,還會請求瀏覽器提供用戶證書。
客戶端檢查服務器證書,如果檢查失敗,則提示無法建立SSL連接。如果成功,那麽繼續。客戶端瀏覽器為該會話生成壹個預主密鑰,用服務器公鑰對其加密,並將其發送給服務器。如果服務器請求識別客戶端,客戶端將簽署壹些其他數據,並將其與客戶端證書壹起發送到服務器。
如果服務器要求對客戶端進行身份驗證,請檢查簽署客戶端證書的CA是否可信。如果它不在信任列表中,請結束此會話。如果檢查通過,服務器用自己的私鑰解密接收到的預主秘密,並使用它通過壹些算法生成本次會話的主秘密。
3客戶端和服務器都使用這個主密鑰來生成這個會話的會話密鑰(對稱密鑰)。此會話密鑰用於雙方SSL握手後傳遞的任何消息。其主要原因是對稱加密的計算復雜度比非對稱加密低壹個數量級以上,可以顯著提高通話雙方的運算速度。?客戶端通知服務器此後發送的所有消息都用這個會話密鑰加密。並通知服務器客戶機已經完成了這個SSL握手。服務器通知客戶端,此後發送的所有消息都用這個會話密鑰加密。並通知客戶機服務器這個SSL握手已經完成。
證書的初始化功能:
void mbed TLS _ x509 _ CRT _ init(mbed TLS _ x509 _ CRT * CRT){
memset( crt,0,sizeof(mbed TLS _ x509 _ CRT));}
證書的空間釋放功能
void mbed TLS _ x509 _ CRT _ free(mbed TLS _ x509 _ CRT * CRT)
證書結構:
typedef結構mbedtls_x509_crt
{
mbedtls _ x509 _ buf raw隨機數據
mbedtls _ x509 _ buf tbs符號
int版本;版本
mbedtls _ x509 _ buf serial?由CA頒發的唯壹序列號。
mbedtls _ x509 _ buf sig _ oid簽名算法,如sha1RSA *
mbedtls _ x509 _ time valid _ from證書有效期開始時間
mbedtls _ x509 _ time valid _ to證書到期時間
mbedtls _ pk _ context pk公鑰容器
int ext _ types?/* * & lt;包含檢測和解析的擴展名的位字符串*/
int max _ pathlen最大路徑長度
mbedtls _ x509 _ buf sig用私鑰加密的簽名
mbedtls _ md _ type _ t sig _ md信息摘要生成算法的名稱。mbed TLS _ MD _ sha 256 mbed TLS _ PK _ type _ tsig _ PK;簽名加密算法集名稱MBEDTLS_PK_RSA */
struct mbedtls _ x509 _ crt * next指向下壹個證書的指針
}
Mbedtls中的握手:
客戶端功能
int mbed TLS _ SSL _ handshake _ client _ step(mbed TLS _ SSL _ context * SSL)
輸入參數是ssl_context,它是安全連接的配置參數,包括握手狀態、握手參數、會話數據、客戶端ID和相關的回調條目。
以下程序摘自ssl_tls.c文件,可以看出mbed已經按照宏定義分別實現了服務器端和客戶端。
#如果已定義(MBEDTLS_SSL_CLI_C)
if(SSL-& gt;conf->;端點== MBEDTLS_SSL_IS_CLIENT)
ret = mbed TLS _ SSL _ handshake _ client _ step(SSL);
#endif
#如果已定義(MBEDTLS_SSL_SRV_C)
if(SSL-& gt;conf->;端點== MBEDTLS_SSL_IS_SERVER)
ret = mbed TLS _ SSL _ handshake _ server _ step(SSL);
#endif
客戶端邏輯:
客戶端發起clienthello請求後,服務器返回serverhello包和證書(如果客戶端有認證需求,會發送證書請求包請求客戶端的證書),然後客戶端開始分析服務器證書是否有效合法:
首先確認是否需要證書驗證,判斷是否SSL-& gt;transform _ negotiate->;密碼套件_信息字段
MBEDTLS _ KEY _ EXCHANGE _ ECJPAKE,
MBEDTLS_KEY_EXCHANGE_PSK,
MBEDTLS_KEY_EXCHANGE_DHE_PSK,
MBEDTLS_KEY_EXCHANGE_ECDHE_PSK
以上四個psk加密套件不需要證書交互,需要證書的加密套件如下:
MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,
mbed TLS _ KEY _ EXCHANGE _ ECD he _ ECD sa,
MBEDTLS_KEY_EXCHANGE_ECDH_RSA,
mbed TLS _ KEY _ EXCHANGE _ ECDH _ ECD sa,
其次,驗證證書的有效性:mbed TLS _ x509 _ CRT _ verify _ with _ profile是x509_crt.c中的驗證函數,其輸入參數為對等證書、證書鏈、可信ca列表、認證配置文件和會話的認證參數。
1.比較CN字段是否匹配,如果不匹配,返回CN _ MISMATCH error-x509 _ memcasecmp函數。
2.根據配置文件檢查密鑰大小和類型是否正確。如果不正確,將返回BAD_KEY錯誤-x509 _ profile _ check _ key函數。
3.判斷CA的頒發者和父頒發者(頒發鏈)是否可信——x509 _ CRT _ check _ parent函數。
驗證後會判斷證書是否使用EC key,如果是,則使用函數mbedtls_ssl_check_curve驗證橢圓曲線是否正確。