簡體   English   中英

如何在C#或Java握手期間讀取ocsp裝訂響應

[英]How to read ocsp stapled response during handshake in C# or Java

服務器將與OCSP響應器進行通信並裝訂響應。 客戶端如何檢查C#或Java中的裝訂響應。 Bouncy Castle,Chiklat,本地庫-他們稱客戶似乎有辦法與OCSP響應者進行對話,但看不到裝訂后的響應。

正如您已經正確提到的那樣,在握手過程中完成了裝訂。 我只知道如何在Bouncy Castle的C#端口中執行此操作,因為我正在實現基於BC的PKIX加密組件,該組件還考慮了OCSP,並且大大簡化了BC調用(准備就緒時,我將在此處報告)發布Alpha版本,很可能是開源的)。

首先,根據RFC6066 ,只有在Client-Hello中請求裝訂響應時,才發送裝訂響應。 要啟用此功能,您必須覆蓋TlsClient GetClientExtensions (例如,當您繼承DefaultTlsClient ):

  using BouncyTls = Org.BouncyCastle.Crypto.Tls;
  ...
  public override IDictionary GetClientExtensions() // Override in your TlsClient class
  {
    IDictionary clientExtensions = base.GetClientExtensions();
    clientExtensions = BouncyTls.TlsExtensionsUtilities.EnsureExtensionsInitialised(clientExtensions);
    byte type = BouncyTls.CertificateStatusType.ocsp;
    var request = new BouncyTls.OcspStatusRequest(null, null);
    BouncyTls.TlsExtensionsUtilities.AddStatusRequestExtension(clientExtensions, new BouncyTls.CertificateStatusRequest(type, request));

    return clientExtensions;
  }

之后,如果支持,服務器將發送裝訂響應。 但是,該響應僅在握手期間可用,如果您看到Bouncy Castle的源代碼,則會在TlsClientProtocol實例的CompleteHandshake TlsClientProtocol其清除。 因此,您也必須在這里攔截:

  protected override void CompleteHandshake() // Override in your TlsClientProtocol class
  {
    // After the handshake completed, we do not have any access to the handshake data anymore
    // (see TlsClientProtocol.CleanupHandshake). Therefore we must intercept here to gather information
    YourValidationOfTheOcspResponse(mCertificateStatus);
    // mCertificateStatus holds the response. It is cleared after the following call:
    base.CompleteHandshake();
  }

我花了幾個小時,直到我了解了充氣城堡在做什么,以及如何提取裝訂響應,盡管這樣做的代碼非常簡單。 一個好的起點總是找到對應的RFC並將字段與BC比較,因為Bouncy Castle在大多數情況下使用完全相同的標識符。

只是另一注; 為了符合TLS標准,如果狀態條目告訴您證書已被撤銷,請使用RaiseAlertFatal編寫正確的錯誤記錄(請參閱RFC8446 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM