工作中需要建立一套HSM的HTTPS雙向認(rèn)證通道,即通過硬件加密機(Ukey)進行本地加密運算的HTTPS雙向認(rèn)證,和銀行的UKEY認(rèn)證類似。
NodeJS可以利用openSSL的HSM plugin方式實現(xiàn),但是需要編譯C++,太麻煩,作者采用了利用Node Socket接口,純JS自行實現(xiàn)Https/Http協(xié)議的方式實現(xiàn)
具體實現(xiàn)可以參考如下 node-https-hsm
TLS規(guī)范自然是參考RFC文檔 The Transport Layer Security (TLS) Protocol Version 1.2
概述
本次TLS雙向認(rèn)證支持以下加密套件(*為建議使用套件):
TLS_RSA_WITH_AES_128_CBC_SHA256(TLS v1.2) * TLS_RSA_WITH_AES_256_CBC_SHA256(TLS v1.2) * TLS_RSA_WITH_AES_128_CBC_SHA(TLS v1.1) TLS_RSA_WITH_AES_256_CBC_SHA(TLS v1.1)四種加密套件流程完全一致,只是部分算法細(xì)節(jié)與報文略有差異,體現(xiàn)在
AES_128/AES_256的會話AES密鑰長度分別為16/32字節(jié)。 TLS 1.1 在計算finish報文數(shù)據(jù)時,進行的是MD5 + SHA1的HASH算法,而在TLS v1.2下,HASH算法變成了單次SHA256。 TLS 1.1 處理finish報文時的偽隨機算法(PRF)需要將種子數(shù)據(jù)為分兩塊,分別用 MD5 / SHA1 取HASH后異或,TLS 1.2 為單次 SHA256。 TLS 1.2 的 CertificateVerify / ServerKeyExchange 報文末尾新增2個字節(jié)的 Signature Hash Algorithm,表示 hash_alg 和 sign_alg。目前業(yè)界推薦使用TLS v1.2, TLS v1.1不建議使用。
流程圖
以下為 TLS 完整握手流程圖
* =======================FULL HANDSHAKE====================== * Client Server * * ClientHello --------> * ServerHello * Certificate * CertificateRequest * <-------- ServerHelloDone * Certificate * ClientKeyExchange * CertificateVerify * Finished --------> * change_cipher_spec * <-------- Finished * Application Data <-------> Application Data
流程詳解
客戶端發(fā)起握手請求
TLS握手始于客戶端發(fā)起 ClientHello 請求。
struct { uint32 gmt_unix_time; // UNIX 32-bit format, UTC時間 opaque random_bytes[28]; // 28位長度隨機數(shù)} Random; //隨機數(shù)struct { ProtocolVersion client_version; // 支持的最高版本的TLS版本 Random random; // 上述隨機數(shù) SessionID session_id; // 會話ID,新會話為空 CipherSuite cipher_suites<2..2^16-2>; // 客戶端支持的所有加密套件,上述四種 CompressionMethod compression_methods<1..2^8-1>; // 壓縮算法 select (extensions_present) { // 額外插件,為空 case false: struct {}; case true: Extension extensions<0..2^16-1>; };} ClientHello; // 客戶端發(fā)送支持的TLS版本、客戶端隨機數(shù)、支持的加密套件等信息服務(wù)器端回應(yīng)客戶端握手請求
新聞熱點
疑難解答
圖片精選