[英]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.