[英]Send and receive multiple client certificates in one request with C#
我編寫了一個簡單的 REST API 端點來驗證收到的客戶端證書。 端點配置為
<security mode="Transport">
<transport clientCredentialType="Certificate" />
</security>
在代碼中,收到的證書被轉換為 X509Certificate2; 從那里可以驗證它。
new X509Certificate2(HttpContext.Current.Request.ClientCertificate.Certificate)
該站點現在托管在 IIS 上,並從那里配置為需要證書。
在客戶端,證書被添加到HttpClientHandler
var instance = new HttpClientHandler();
instance.ClientCertificates.Add(certificate);
這一切正常...
但是現在我想向同一個請求添加第二個客戶端證書; 看起來應該支持..因為HttpClientHandler.ClientCertificates
是一個集合。 因此,我在請求中添加了第二個證書。
但是應該如何在服務器端檢索這兩個證書呢? 因為HttpContext.Current.Request.ClientCertificate.Certificate
不是一個集合。
附加信息:多個客戶端證書的原因是因為我需要編寫一個需要證書-A 的代理類應用程序; 但真正的端點需要證書-B。 因此代理應用程序需要檢索兩者。
編輯
好的,我知道為什么這是不可能的; 但是,有些人堅持我將其寫為“編輯”而不是“答案”,因為它不能解決問題。 (有些事情是無法修復的)
就我現在所知; 您可以向客戶端處理程序提供多個證書,但處理程序會選擇使用哪個證書的正確證書(基於服務器通過握手應用的信息)。 我不確定服務器發送什么信息,以及如何選擇正確的證書來建立連接; 但是我很確定只使用/發送了 1 個客戶端證書來設置連接。 修復底層問題; 我需要以另一種方式向代理提供第二個證書(可能作為正文數據,或在代理端預先配置)。
Is not impossible
,但不可能在盒子里。 不要忘記每個證書都附加到通信中,而通信本身確實是具有特定協議的 TCP/IP 數據傳輸。 但是這個協議在這種情況下是開放的。
所以:
您可以讀取您的證書並將其寫入您自己的標頭值的通信中。 這里沒有限制: Maximum on HTTP header values?
當然,您也可以將其附加到內容中。 您可以使用標題和真實正文制作您的內容,所有內容都打包為正文。
然后在另一側,您可以讀取標題上的證書,並在已安裝證書的另一側進行比較和檢查(或未安裝,可能只是在正確的文件夾中)
基本上是一樣的,不過是自己做的。
注意:這僅適用於您控制通信雙方的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.