簡體   English   中英

使用 C# 在一個請求中發送和接收多個客戶端證書

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

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