1. 程式人生 > >X509證書驗證研究(2)——GDB跟蹤

X509證書驗證研究(2)——GDB跟蹤

    根據SSL流程,斷點可以打在ssl3_get_server_certificate函式上。     本函式中,通過一個for迴圈把獲取到的證書存放到一個證書棧sk上,本次跟蹤, 只有一個server證書。此後進入 ssl_verify_cert_chain 去驗證證書鏈。     ssl_verify_cert_chain 先獲取一個 verify_store ,此時 verify_store = s->ctx->cert_store 這個還沒有研究,後面再看。     ssl_verify_cert_chain函式從sk中取出第一個證書,即server證書,建立一個X509_STROE_CTX ctx 並通過X509_STORE_CTX_init進行初始化:     ctx->ctx  = verify_store;     ctx->cert = x; //server的證書     ctx->untrusted = sk; //server所在的sk     初始化了需要認證的ctx->param,並初始化了ctx中的一系列check函式,本例中都是用的預設。     回到ssl_verify_cert_chain函式中後,又對ctx做了一系列的初始化。     然後呼叫 X509_verify_cert 進行驗證。     需要知道關注的是,此時 ctx->param的設定:purpose被設定為 X509_PURPOSE_SSL_SERVER, trust 被設定為 X509_TRUST_SSL_SERVER ,depth 被設定為 100.     下面是主要函式 X509_verify_cert 的分析     建立ctx->chain並把ctx->cert放到ctx->chain中。然後在一個for迴圈中對證書做驗證操作。 讓我不太理解的是,控制for迴圈的引數 num = 1,但這裡是一個迴圈,其意義何在?需要深入內部 繼續分析。     for迴圈中首先對驗證深度校驗,然後呼叫cert_self_sign檢視證書是否是自簽名。如果是自簽名 則跳出for迴圈。     cert_self_sign-->X509_check_purpose-->x509v3_cache_extensions(處理擴充套件資訊)     由此可見cert_self_sign不單單去驗證是否自簽名,還處理了一些擴充套件項。。。函式功能不唯一。     這個函式中先生成了服務端證書的fingerprint,放在x->sha1_hash中。     由於我的server證書中有以下擴充套件項:     Authority Information Access、X509v3 Authority Key Identifier、X509v3 Basic Constraints、     X509v3 CRL Distribution Points、X509v3 Extended Key Usage、X509v3 Key Usage、     X509v3 Subject Key Identifier     因此中解析時,x->ex_flags被打上以下標記:EXFLAG_BCONS EXFLAG_KUSAGE EXFLAG_XKUSAGE      EXFLAG_SET     同時以下值被賦值:     x->ex_kusage = 160     x->ex_exkusage = XKU_SSL_CLIENT | XKU_SSL_SERVER     x->skid     x->akid     x->crldp     最終返回到cert_self_sign是通過檢視標記來判斷的,這裡沒有打標記,因此不是自簽名。     此後有一個判斷 if (ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST) ,搜了下該巨集的呼叫處, 是通過命令列引數   -trusted_first 來設定的。搜了下,也沒看到這個說明。在這裡我們不會走到 此處。     下面是 if (ctx->untrusted != NULL) 這裡的判斷。在這裡會先用find_issuer來找頒發者。從這裡 可以看到num有變更,可以解釋上面的迴圈的問題。即如果ctx->untrusted 這裡存的是一個證書鏈,那麼 find_issuer 是可能返回值的,那樣就會繼續向上找頒發者。本例中,由於只有一個證書,因此這裡不會 繼續迴圈處理。     然後進入do{}while(retry),結合程式碼的虛擬碼如下:     do {         取出ctx->chain中的最後一個證書x(ctx->chain可能是個證書鏈)         if (x是自簽名證書) //這裡沒走到,從程式碼流程裡大概寫了下,未必正確,因為從程式碼邏輯看比較混亂         {             if (ctx->chain中只有1個證書)             {                 判斷頒發者資訊之類的。             }             else             {                 取出最後的自簽名證書x             }         }         for (;;) {             如果發現證書自簽名或者認證深度超出預期則跳出迴圈。             通過 ctx->get_issuer (X509_STORE_CTX_get1_issuer) 查詢證書的頒發者。構造認證鏈。         }         上面的for迴圈還是什麼都沒有做,繼續走 check_trust函式,這裡檢查是否有在信任鏈         中的證書,仍然返回沒有。         if (三個判斷) {這裡仍然麼有處理}     }while(retry)     這裡單獨研究一下 X509_STORE_CTX_get1_issuer 這個函式。     先通過 X509_get_issuer_name 獲取 issuer_name ,存到xn中,     然後呼叫 X509_STORE_get_by_subject ,這個函式通過 subject 查詢X509_OBJECT ,這裡會到給定 的dir下和預設dir下找,但是都找不到。這是實際是想從store裡找,但是沒找到。     呼叫 check_chain_extensions 檢查擴充套件項 等等。最後進入internal_verify 。。奇怪,沒有驗證到     這是因為命令用法不對,指定CApath時,路徑儲存的證書名字需要使用hash.0的方式。 [[email protected] cacerts]# openssl x509 -hash -in root-ca.crt -noout 5ed7b970 [[email protected] cacerts]# openssl x509 -hash -in sub-ca.crt -noout c2eb42c3     把證書重新命名: [[email protected] cacerts]# ll total 32 -rw-r--r--. 1 root root 6884 Mar  3 15:43 5ed7b970.0 -rw-r--r--. 1 root root 8187 Mar  3 15:43 c2eb42c3.0 -rw-r--r--. 1 root root 6884 Mar  2 16:08 root-ca.crt -rw-r--r--. 1 root root 8187 Mar  2 16:08 sub-ca.crt     然後使用 [
[email protected]
bin]# ./openssl s_client -ssl3 -CApath /home/demoCA/cacerts/ CONNECTED(00000003) depth=2 C = CN, O = Certusnet, CN = Root CA verify return:1 depth=1 C = CN, O = Certusnet, CN = Sub CA verify return:1 depth=0 C = CN, ST = Some-State, O = Certusnet, CN = Server verify return:1 --- Certificate chain  0 s:/C=CN/ST=Some-State/O=Certusnet/CN=Server    i:/C=CN/O=Certusnet/CN=Sub CA  1 s:/C=CN/O=Certusnet/CN=Sub CA    i:/C=CN/O=Certusnet/CN=Root CA  2 s:/C=CN/O=Certusnet/CN=Root CA    i:/C=CN/O=Certusnet/CN=Root CA --- Server certificate -----BEGIN CERTIFICATE----- MIIEszCCApugAwIBAgIRAPz0LWzyAEf7U/3XDFhLyFowDQYJKoZIhvcNAQELBQAw MjELMAkGA1UEBhMCQ04xEjAQBgNVBAoMCUNlcnR1c25ldDEPMA0GA1UEAwwGU3Vi IENBMB4XDTE2MDMwMjA4NTE0MVoXDTE3MDMwMjA4NTE0MVowRzELMAkGA1UEBhMC Q04xEzARBgNVBAgMClNvbWUtU3RhdGUxEjAQBgNVBAoMCUNlcnR1c25ldDEPMA0G A1UEAwwGU2VydmVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5Awc0N9sd LSxbWZShMUie5f662MTVDTYzV2eImSdsELtD9eTdJe/ZLrZN2fL/wUj1aRFt//zT 4Q7hNJvC3diVJ3tyn6DD8PD+YQfeRVnZgIFB1b3nM6I5qftb72e3IO6LvFMwF0jE VxvRYUm6hO01rU0iaMqtqVxO6cF5gs+H3QIDAQABo4IBMTCCAS0wdQYIKwYBBQUH AQEEaTBnMDIGCCsGAQUFBzAChiZodHRwOi8vc3ViLWNhLmNlcnR1c25ldC5jb20v c3ViLWNhLmNydDAxBggrBgEFBQcwAYYlaHR0cDovL29jc3Auc3ViLWNhLmNlcnR1 c25ldC5jb206OTA4MTAfBgNVHSMEGDAWgBTQJbdgHNl+Hd9tKj+wOCeuQcYaCzAM BgNVHRMBAf8EAjAAMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9zdWItY2EuY2Vy dHVzbmV0LmNvbS9zdWItY2EuY3JsMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF BQcDATAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0OBBYEFHBd8lxWlnkeFhw+hxnVkqoT N3NbMA0GCSqGSIb3DQEBCwUAA4ICAQB9LuXZteSc4E+nHHpYjH2vRJtYlCGV9jjh bIbFSvJxTU7/Tx8JjcQavm9KtUGoIcMsZ2VELpVXOzW8MlM0yXlQ8bPhZNyVtk6R n4J3sNtPGJ7vX6aSZP0ba34ObDSd6VSHlXqoa3UaIHCE3oogoGKHfkU5/pn6wAXr 77ebhkLjcBhV4vilrq+xWvABtOB3O/3wI0Yn28HnXWtlwN2XROfK/7sSPDQahKaf yStY8exY6RRGhzUuNbEbW1AIsuXqeM4KcYYAKwlzFUt7+1/OU7QMpN5F29oasSgS 8F3yTttsx9V6W5buqzDcICF+zY4ssX4EAsIcY2zNOsHC2SojNELFtabKFyXijRKV VIQoTkic07KBQxrJG6mKanxL1Q8h+2MDt7kbxJz1NxXuQGV4smxMN2ZBUU1Ufnnr nrjxnZZfBCR0Zt2OjQrTWv3tkF6GNhS1wufh4n9A1JcGr+xfzVP0O9FlAhVtauNS DwjgAvQhjjemCMowMDTVJei9sCRZjZtQberA4DfGOReTjukMrR+QMaqRx4TfYpqn mVYyEUPxFau7pJXFtYYPDLOwPvJhK0nM2fC72E4DOHzRMSR9fLUrJXC8q8wK/iKJ 76F6vJcCisGmzPJeltqJvB3KvrKa/at0wkrtym2LNp6j5shhwoXhBh693y0gNLTL GzcQpVl37Q== -----END CERTIFICATE----- subject=/C=CN/ST=Some-State/O=Certusnet/CN=Server issuer=/C=CN/O=Certusnet/CN=Sub CA --- No client certificate CA names sent Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 4624 bytes and written 308 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA Server public key is 1024 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session:     Protocol  : SSLv3     Cipher    : ECDHE-RSA-AES256-SHA     Session-ID: BEB2B5AFCDAAD0B84DEF8F157F61B2FCC7C362FFA5B699B1A0A4E47F1827304A     Session-ID-ctx:      Master-Key: 28D10D8B8FE3702C5529A9F0F13323FC599412E1291C336827921B9427522A613A917FA68AED9DBBCA1F9E8E167FB9F6     Key-Arg   : None     PSK identity: None     PSK identity hint: None     SRP username: None     Start Time: 1457003801     Timeout   : 7200 (sec)     Verify return code: 0 (ok) --- 這把可以看到Verfiy return code是正常的了,是一個自簽名證書鏈。 internal_verify 裡面依次驗證root-ca、sub-ca、server的證書,最後ok。 需要注意 ctx->get_issuer 裡去找頒發者,這裡會到知道的目錄裡面通過hash生成名字去找。

相關推薦

X509證書驗證研究2——GDB跟蹤

    根據SSL流程,斷點可以打在ssl3_get_server_certificate函式上。     本函式中,通過一個for迴圈把獲取到的證書存放到一個證書棧sk上,本次跟蹤, 只有一個server證書。此後進入 ssl_verify_cert_chain 去

Android中apk動態載入技術研究2android插件化及實現

name creat package path iss fontsize 調用 dex con 了解了android中類載入的前期知識點後,來看看android中DexClassLoader詳細的實現 詳細載入流程例如以下: 宿主程序會到文件系統比

測量人臉顏值的標準有哪些,人臉影象演算法研究2

今天帶來一篇人臉識別中的顏值打分技術,所謂“顏值”,基於什麼標準來評判高低呢?既然是個“數值”,那到底能不能“測量”一下? 概述 近年來隨著人臉識別技術的發展,顏值打分也受到了廣泛的關注與研究。可即使人來打分,大家也口味各異,御姐蘿莉各有所愛。計算機又豈能判

Android原始碼之Gallery專題研究2

引言 上一篇文章已經講解了資料載入過程,接下來我們來看一看資料載入後的處理過程。按照正常的思維邏輯,當資料載入之後,接下來就應該考慮資料的顯示邏輯。 MVC顯示邏輯 大家可能對J2EE的MVC架構比較熟悉,Gallery2和MVC有什麼關係呢,簡直是瞎扯???首先,我們先回

Asp.net2.0中基於Forms驗證的角色驗證授權2

以admin角色為例,只允許角色為admin的使用者訪問 1.設定Web.Config檔案 <roleManager enabled="true"/>   <authorization>         <allow roles="adm

聚類方法:DBSCAN演算法研究2--matlab程式碼實現

DBSCAN聚類演算法三部分: 1、        DBSCAN原理、流程、引數設定、優缺點以及演算法; 2、        matlab程式碼實現; 3、        C++程式碼實現及與matlab例項結果比較。 摘要:介紹DBSCAN原理、流程、引數設

wifi通訊過程的研究--2Wifi傳輸認證過程

二、 Wifi傳輸認證過程 (一)、終端與路由器認證過程 1、無線掃描 使用者接入過程首先需要通過主動/被動掃描,再通過認證和關聯 兩個過程後才能和AP建立連線。 2、認證過程 為防止非法使用者接入,首先需要在使用者和AC/FATAP /Gateway之間建立認證,認證機制

第十一週專案1-驗證演算法2二叉樹構造演算法的驗證

問題及程式碼: /* *煙臺大學計算機與控制工程學院 /* *Copyright (c) 2015,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱:lulu

Java反射研究2

接Java反射研究(1) 九、呼叫特定方法 Method m = c1.getMethod("funcname",Class<?>...c);   //funcname表示呼叫方法的名稱,c表示引數的Class物件 例如:Method m = c1.getM

研究些架構,少談些框架 2 :微服務和充血模型

方法 平時 是把 小系統 生涯 過程 語句 小結 大量 上篇我們聊了微服務的DDD之間的關系,很多人還是覺得很虛幻,DDD那麽復雜的理論,聚合根、值對象、事件溯源,到底我們該怎麽入手呢? 實際上DDD和面向對象設計、設計模式等等理論有千絲萬縷的聯系,如果不熟悉OOA、OOD

SQL Server On Linux2——SQL Server 2019 For Linux安裝過程細節研究

  接上文SQL Server On Linux(1)——CentOS 7 安裝SQL Server2019 在安裝過程中,作者發現了一些資訊,這些資訊引起了作者的興趣,那麼下面作者把自己研究的結果分享出來,如果讀者對此有深入研究過,歡迎指正。 為什麼要研究這些東西?說白了就

量化交易2——OKEX簽名驗證中MD5加密的坑

hexdigest = hmac.new(payload, digestmod=hashlib.md5).hexdigest().upper() hexdigest = hashlib.md5(payload).hexdigest().upper()#OK支援的是這種

2移動端驗證碼效果

<!-- 驗證碼輸入框 --> HTML: <div class="container" id="test"> <div class="val-box" id="val-box">

端到端車牌/驗證碼識別tensorflow版——2

端到端車牌識別(2) 二 、CNN方法 4. 模型訓練 先附上程式碼train.py: """ Created on Tue Sep 5 15:37:26 2017 @author: llc """ #%% import os import numpy as

研究基於spring通過對http請求資料的預處理資料加解密、校驗、日誌2過攔截器篇

上文已經詳細講解了如何對request進行處理,本文主要是案例演示 spring MVC 的寫法 新增攔截器 定義一個攔截器 public class AppRequestIntercept

基於神經網路的驗證碼實驗研究

前言 本次實驗研究完整程式碼 ->進入 From Github 一.CAPTCHA 提到驗證碼,生活中各種各樣的平臺都會在使用者常規操作管理下實行驗證碼機制。對於我淺顯的理解,一是區分人與機器的認證互動,在有行為發生的情況下,我們要判斷是否是使用者主觀操作,本意所為,因

Leetcode題解之連結串列2驗證二叉搜尋樹

題目描述: 給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。 假設一個二叉搜尋樹具有如下特徵: 節點的左子樹只包含小於當前節點的數。 節點的右子樹只包含大於當前節點的數。 所有左子樹和右子樹自身必須也是二叉搜尋樹。 示例 1: 輸入: 2 /

CAS單點登入2:cas-4.0.0-server 去掉https驗證

目錄 目錄 去掉https驗證 1. 修改deployerConfigContext.xml新增p:requireSecure=”false” 2. 修改ticketGrantingTicketCookieGenerat

GALV_maptravel研究分析2

本節地圖:Gov's Mansion,Campsite,Yourmansion       ++++++++++++++++++++華麗麗的分割線+++++++++++++++++++++++++++++++++ 1.NPC處指令碼 這裡不需要過多解釋

python爬蟲學習2用tesserocr識別影象驗證

在學習爬蟲的過程中難免會遇到驗證碼問題,作為純自動化的爬蟲是不可能手動去輸入驗證碼的。 那麼我們就要學會怎麼去識別它。 而驗證碼也分很多種類,主要的幾種: (1)影象驗證碼:這是最簡單的一種,也很常見。就比如CSDN登入幾次失敗之後就會出驗證碼。 (2)滑塊驗證碼