1

我瞭解數字簽名如何實現不可抵賴性和完整性,但這是我尚未掌握的身份驗證。使用數字簽名對服務器進行身份驗證

我正在開發C#中的客戶端 - 服務器應用程序,應該能夠使用數字證書和數字簽名進行身份驗證。我知道如何檢查Signature(使用SignedCms.CheckSignature())的有效性和完整性,但是如何驗證涉及的任何部分?

例如:

  1. 客戶端要求服務器的數字簽名,
  2. 客戶端接收簽名和驗證它,
  3. 如果驗證成功,請繼續。

客戶端可能是中間人攻擊的受害者,並在步驟2中接收到有效簽名。驗證會成功,但客戶端不會與正確的服務器通話。

我錯過了什麼?

回答

1

您缺少對簽名證書的信任。

考慮SSL證書,它們具有通向Windows(或任何操作系統)信任的根CA的簽名路徑。如果MITM提供自簽名證書,或者由不可信CA產生,那麼瀏覽器會拒絕它,並顯示警告。因此,只有證書是由您知道的CA頒發的證書纔可信,或者鏈接到您知道的證書。

對於自簽名證書而言,它變得更加複雜,您需要安全地交換密鑰指紋,序列號或其他常量標識符,並驗證簽名密鑰實際上是您期望的 - 這就是爲什麼自簽名證書通常不應該「用於面向公衆的網站或其他服務。

因此,如果出現MITM攻擊,並且原始機器的簽名被刪除,則消息會發生變化,然後使用未知證書進行辭職,只要您檢查簽名證書的身份與您信任的某個證書相對應,我會拒絕辭職的消息。

(在現實中卻變得更爲複雜,但你希望點)

1

如果中間的人擁有簽署請求的私鑰,他們只能收到有效簽名。我認爲您可能會錯過的關鍵是改變數字簽名項目的任何方面都會使簽名失效。中間的人可以重新提交請求,但如果他們改變了,簽名驗證將失敗。

+0

如果什麼中間人塊簽名來自服務器,並且向客戶端發送一個全新的數字簽名,由可信任的CA簽發完全有效的證書? – 2011-01-13 00:04:45

+0

當客戶端試圖使用預先存在的公鑰來驗證sig時,它會失敗。如果客戶接受一個新的簽名,那麼當然,所有的賭注都是關閉的,所以在您使用信任鏈接受它之前,您必須確保一個證書是可信的。 – 2011-01-13 00:30:28

相關問題