亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

詳解NodeJS Https HSM雙向認證實現

2024-05-06 16:49:00
字體:
來源:轉載
供稿:網友

工作中需要建立一套HSM的HTTPS雙向認證通道,即通過硬件加密機(Ukey)進行本地加密運算的HTTPS雙向認證,和銀行的UKEY認證類似。

NodeJS可以利用openSSL的HSM plugin方式實現,但是需要編譯C++,太麻煩,作者采用了利用Node Socket接口,純JS自行實現Https/Http協議的方式實現

具體實現可以參考如下 node-https-hsm

TLS規范自然是參考RFC文檔 The Transport Layer Security (TLS) Protocol Version 1.2

概述

本次TLS雙向認證支持以下加密套件(*為建議使用套件):

  • 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)

四種加密套件流程完全一致,只是部分算法細節與報文略有差異,體現在

  • AES_128/AES_256的會話AES密鑰長度分別為16/32字節。
  • TLS 1.1 在計算finish報文數據時,進行的是MD5 + SHA1的HASH算法,而在TLS v1.2下,HASH算法變成了單次SHA256。
  • TLS 1.1 處理finish報文時的偽隨機算法(PRF)需要將種子數據為分兩塊,分別用 MD5 / SHA1 取HASH后異或,TLS 1.2 為單次 SHA256。
  • TLS 1.2 的 CertificateVerify / ServerKeyExchange 報文末尾新增2個字節的 Signature Hash Algorithm,表示 hash_alg 和 sign_alg。

目前業界推薦使用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

流程詳解

客戶端發起握手請求

TLS握手始于客戶端發起 ClientHello 請求。

struct {  uint32 gmt_unix_time; // UNIX 32-bit format, UTC時間  opaque random_bytes[28]; // 28位長度隨機數} Random; //隨機數struct {  ProtocolVersion client_version; // 支持的最高版本的TLS版本  Random random; // 上述隨機數  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; // 客戶端發送支持的TLS版本、客戶端隨機數、支持的加密套件等信息

服務器端回應客戶端握手請求

服務器端收到 ClientHello 后,如果支持客戶端的TLS版本和算法要求,則返回 ServerHello, Certificate, CertificateRequest, ServerHelloDone 報文

struct {  ProtocolVersion server_version; // 服務端最后決定使用的TLS版本  Random random; // 與客戶端隨機數算法相同,但是必須是獨立生成,與客戶端毫無關聯  SessionID session_id; // 確定的會話ID  CipherSuite cipher_suite; // 最終決定的加密套件  CompressionMethod compression_method; // 最終使用的壓縮算法  select (extensions_present) { // 額外插件,為空    case false:      struct {};    case true:      Extension extensions<0..2^16-1>;  };} ServerHello; // 服務器端返回最終決定的TLS版本,算法,會話ID和服務器隨機數等信息struct {  ASN.1Cert certificate_list<0..2^24-1>; // 服務器證書信息} Certificate; // 向客戶端發送服務器證書struct {  ClientCertificateType certificate_types<1..2^8-1>; // 證書類型,本次握手為 值固定為rsa_sign   SignatureAndHashAlgorithm supported_signature_algorithms<2^16-1>; // 支持的HASH 簽名算法  DistinguishedName certificate_authorities<0..2^16-1>; // 服務器能認可的CA證書的Subject列表} CertificateRequest; // 本次握手為雙向認證,此報文表示請求客戶端發送客戶端證書struct {} ServerHelloDone // 標記服務器數據末尾,無內容

客戶端收到服務器后響應

客戶端應校驗服務器端證書,通常用當用本地存儲的可信任CA證書校驗,如果校驗通過,客戶端將返回 Certificate, ClientKeyExchange, CertificateVerify, change_cipher_spec, Finished 報文。

CertificateVerify 報文中的簽名為 Ukey硬件簽名 , 此外客戶端證書也是從Ukey讀取。

struct {  ASN.1Cert certificate_list<0..2^24-1>; // 服務器證書信息} Certificate; // 向服務器端發送客戶端證書struct {  select (KeyExchangeAlgorithm) {    case rsa:      EncryptedPreMasterSecret; // 服務器采用RSA算法,用服務器端證書的公鑰,加密客戶端生成的46字節隨機數(premaster secret)    case dhe_dss:    case dhe_rsa:    case dh_dss:    case dh_rsa:    case dh_anon:      ClientDiffieHellmanPublic;  } exchange_keys;} ClientKeyExchange; // 用于返回加密的客戶端生成的隨機密鑰(premaster secret)struct {  digitally-signed struct {    opaque handshake_messages[handshake_messages_length]; // 采用客戶端RSA私鑰,對之前所有的握手報文數據,HASH后進行RSA簽名  }} CertificateVerify; // 用于服務器端校驗客戶端對客戶端證書的所有權struct {  enum { change_cipher_spec(1), (255) } type; // 固定值0x01} ChangeCipherSpec; // 通知服務器后續報文為密文struct {  opaque verify_data[verify_data_length]; // 校驗密文,算法PRF(master_secret, 'client finished', Hash(handshake_messages))} Finished; // 密文信息,計算之前所有收到和發送的信息(handshake_messages)的摘要,加上`client finished`, 執行PRF算法

Finished 報文生成過程中,將產生會話密鑰 master secret,然后生成Finish報文內容。

master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)verify_data = PRF(master_secret, 'client finished', Hash(handshake_messages))

PRF為TLS v1.2規定的偽隨機算法, 此例子中,HMAC算法為 SHA256

PRF(secret, label, seed) = P_<hash>(secret, label + seed)P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +            HMAC_hash(secret, A(2) + seed) +            HMAC_hash(secret, A(3) + seed) + ...// A(0) = seed// A(i) = HMAC_hash(secret, A(i-1))

服務器完成握手

服務收到請求后,首先校驗客戶端證書的合法性,并且驗證客戶端證書簽名是否合法。根據服務器端證書私鑰,解密 ClientKeyExchange,獲得pre_master_secret, 用相同的PRF算法即可獲取會話密鑰,校驗客戶端 Finish 信息是否正確。如果正確,則服務器端與客戶端完成密鑰交換。 返回 change_cipher_spec, Finished 報文。

struct {  enum { change_cipher_spec(1), (255) } type; // 固定值0x01} ChangeCipherSpec; // 通知服務器后續報文為密文struct {  opaque verify_data[verify_data_length]; // 校驗密文,算法PRF(master_secret, 'server finished', Hash(handshake_messages))} Finished; // 密文信息,計算之前所有收到和發送的信息(handshake_messages)的摘要,加上`server finished`, 執行PRF算法

客戶端會話開始

客戶端校驗服務器的Finished報文合法后,握手完成,后續用 master_secret 發送數據。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
3344国产精品免费看| 日韩一级裸体免费视频| 国产精品1234| 中文字幕av一区二区| 亚洲欧美国内爽妇网| 在线观看久久av| 韩日欧美一区二区| 97在线视频精品| 91精品国产自产在线观看永久| 亚洲欧美国产精品专区久久| 久久影视电视剧免费网站| 日韩视频在线观看免费| 欧美极品美女电影一区| 亚洲激情视频网站| 日韩免费在线电影| 亚洲大胆人体在线| 国产福利视频一区二区| www国产亚洲精品久久网站| 久久久久女教师免费一区| 国产日本欧美一区| 久久噜噜噜精品国产亚洲综合| 亚洲性生活视频在线观看| 国产成人91久久精品| 亚洲美女视频网站| 欧美中在线观看| 亚洲人成欧美中文字幕| 精品亚洲一区二区三区| 久久精品99久久香蕉国产色戒| 九九久久国产精品| 日韩在线观看网址| 久久精品男人天堂| 欧美在线亚洲在线| 日本一区二三区好的精华液| 欧美剧在线观看| 在线观看日韩专区| 亚洲精品二三区| 久久久久久久久91| 国语自产精品视频在线看| 日韩av日韩在线观看| 久久久久久久999精品视频| 78m国产成人精品视频| 亚洲欧美日韩一区二区在线| 欧美大片大片在线播放| 精品久久久91| 久久久亚洲欧洲日产国码aⅴ| 午夜精品久久久久久久99热浪潮| 国产精品色午夜在线观看| 国产在线999| 在线看欧美日韩| 97久久精品人搡人人玩| 一本色道久久综合狠狠躁篇的优点| 黄网站色欧美视频| 亚洲新声在线观看| 国产精品久久久久久久久久99| 国产欧美欧洲在线观看| 国内精品小视频在线观看| 91老司机精品视频| 国产成人自拍视频在线观看| 国产精品福利在线| 国产精品福利小视频| 成人网址在线观看| 欧美美最猛性xxxxxx| 欧美日韩不卡合集视频| 在线日韩第一页| 成人网中文字幕| 亚洲欧美福利视频| 亚洲欧美国产制服动漫| 成人免费视频在线观看超级碰| 久久影视电视剧免费网站| 日韩成人在线电影网| 国产区精品视频| 欧美日韩午夜激情| 欧美日在线观看| 国产视频久久久久久久| 久久福利视频导航| 91九色国产在线| 成人免费在线视频网站| 日韩亚洲一区二区| 日本韩国欧美精品大片卡二| 欧美一区二区.| 九色精品免费永久在线| 2025国产精品视频| 亚洲欧美日韩一区在线| 亚洲美女在线观看| 国产精品美女免费看| 久久久久久久一| 91黄色8090| 亚洲级视频在线观看免费1级| 黑人巨大精品欧美一区二区一视频| 九九九久久国产免费| 久久影院资源站| 国产在线视频一区| 在线精品高清中文字幕| 欧美综合国产精品久久丁香| 欧美色播在线播放| 福利视频第一区| 久久久久www| 懂色av中文一区二区三区天美| 欧美电影在线观看网站| 久久久极品av| 国产精品毛片a∨一区二区三区|国| 一夜七次郎国产精品亚洲| 亚洲欧美国产日韩中文字幕| 欧美中文在线免费| 国产91精品久| 亚洲欧美三级在线| 国产精品视频资源| 欧美激情精品久久久久久| 欧美一级片久久久久久久| 欧美性猛交丰臀xxxxx网站| 亚洲精品免费一区二区三区| 久久精品国产亚洲精品2020| 日韩动漫免费观看电视剧高清| 精品人伦一区二区三区蜜桃网站| 91av视频在线免费观看| 久久中文字幕国产| 久久久国产精彩视频美女艺术照福利| 国产精品国产自产拍高清av水多| 视频在线观看一区二区| 亚洲欧洲自拍偷拍| 欧美日韩亚洲视频一区| 91av在线免费观看| 一区二区亚洲精品国产| 97香蕉超级碰碰久久免费的优势| 精品毛片网大全| 中文字幕av一区二区三区谷原希美| 日韩美女在线看| 欧美老女人bb| 亚洲精品99久久久久| 亚洲一级片在线看| 欧美激情精品久久久久久大尺度| 欧美日韩亚洲一区二区三区| 欧美黑人一级爽快片淫片高清| 欧美成在线视频| 精品亚洲精品福利线在观看| 热99精品里视频精品| 日韩欧美一区视频| 成人黄色片在线| 福利视频第一区| 91亚洲午夜在线| 久久伊人精品一区二区三区| 亚洲欧美成人在线| 国产亚洲精品美女久久久| 国产丝袜精品第一页| 午夜精品一区二区三区视频免费看| 91色在线观看| 日韩有码在线电影| 久热精品在线视频| 国产香蕉97碰碰久久人人| 日韩激情视频在线播放| 国产精品久久久久久久久免费看| 国产69精品99久久久久久宅男| 欧美激情免费看| 欧美日韩美女在线观看| 亚洲第一视频在线观看| 亚洲乱码国产乱码精品精天堂| 欧美裸体xxxx极品少妇软件| www.99久久热国产日韩欧美.com| 91香蕉嫩草神马影院在线观看| 亚洲一区二区中文| 欧美激情在线播放| 久久久精品中文字幕| 欧美日韩国内自拍| 欧美激情中文字幕乱码免费|