2012-05-23 27 views
46

我對雙向SSL如何工作有些困惑。客戶如何創建證書發送到服務器?它是從服務器生成並分發給客戶端的嗎?雙向SSL說明

此外,雙向SSL優於單向SSL的優勢是什麼?

回答

71

這兩個證書都應該在連接之前存在。它們通常由認證機構創建(不一定相同)。 (有替代情況下,驗證可以做不同的,但一些驗證要進行必要)。

服務器證書應該由客戶端信任(及以下的命名約定在RFC 6125定義的CA創建)。

客戶端證書應該由服務器信任的CA創建。

這取決於每一方選擇信任。

有一些在線CA工具可以讓您在瀏覽器中申請證書,並在CA發佈證書後將其安裝到證書中。它們不需要位於請求客戶端證書認證的服務器上。

證書分配和信任管理是通過CA實現的公鑰基礎設施(PKI)的作用。 SSL/TLS客戶端和服務器,然後只是該PKI的用戶。

當客戶端連接到請求客戶端證書認證的服務器時,服務器會發送它願意接受的CA列表作爲客戶端證書請求的一部分。客戶隨後可以發送其客戶證書,如果它希望並且合適的證書可用。

客戶端證書身份驗證的主要優點是:

  • 私人信息(私鑰)永遠不會發送到服務器。客戶端在認證過程中根本不會泄露它的祕密。
  • 不知道具有該證書的用戶的服務器仍然可以對該用戶進行身份驗證,前提是該用戶信任頒發證書的CA(並且該證書有效)。這與使用護照的方式非常相似:您可能從未見過向您出示護照的人,但由於您信任簽發機構,因此您可以將該身份與該人聯繫起來。

您可能也有興趣Advantages of client certificates for client authentication? (on Security.SE)

+2

+1對於一個很好的解釋,而不是給予請求谷歌答案;) – Dexters

+0

你應該用'signed by'替換'created'以保持這個相關性 – CharlieS

+1

@CharlieS「*保持這種相關性*」...你的意思是它是在使用「創建」(與問題相符的措辭)時不相關;-)? 「發佈」確實可能是一個更好的詞。 – Bruno

23

您稱之爲「雙向SSL」通常稱爲帶客戶端證書認證的TLS/SSL。

在與example.com的「正常」TLS連接中,只有客戶端驗證它確實正在與example.com的服務器進行通信。服務器不知道客戶是誰。如果服務器想要認證客戶端,通常使用密碼,所以客戶端需要向服務器發送用戶名和密碼,但是這發生在TLS連接內部作爲內部協議(例如HTTP)的一部分,而不是TLS協議本身的一部分。缺點是每個站點都需要一個單獨的密碼,因爲您將密碼發送到服務器。因此,如果您在PayPal和MyPonyForum上使用相同的密碼,那麼您每次登錄到MyPonyForum時都會將此密碼發送到MyPonyForum的服務器,以便此服務器的運營商可以攔截它並在PayPal上嘗試它,並可以使用您的名字進行付款。

客戶端證書認證提供了另一種在TLS連接中驗證客戶端的方法。與密碼登錄相反,客戶端證書認證被指定爲TLS協議的一部分。它與客戶端驗證服務器的方式類似:客戶端生成一個公鑰,並將公鑰提交給受信任的CA進行簽名。 CA返回可用於認證客戶端的客戶端證書。客戶端現在可以使用相同的證書對不同的服務器進行身份驗證(即,您可以對PayPal和MyPonyForum使用相同的證書,而不會冒着可能被濫用的風險)。它的工作方式是,服務器發送證書後,它會要求客戶端提供證書。然後發生一些公鑰魔術(如果你想知道詳細信息,請閱讀RFC 5246),現在客戶端知道它與正確的服務器通信,服務器知道它與正確的客戶端進行通信,並且都有一些共同的密鑰材料來加密和驗證連接。

+0

我創建了一個client-rest-api,它調用了一個server-rest-api(單向通話)。我的client-rest-api使用由server-rest-api發佈的證書。但是我的客戶端rest-api從來沒有向server-rest-api發出任何證書。它是根據單向SSL還是雙向SSL? 事件,雖然它只是從客戶端到服務器的單向調用,但我認爲它的雙向ssl,因爲在這裏server-rest-api驗證客戶端是否具有服務器發出的正確證書? –

+1

@HimalayMajumdar:如果你的服務器有一個由CA簽名的證書,或者你已經將該證書硬編碼到你的客戶端(固定),那麼是的,它仍然是適當的TLS和客戶端證書驗證(你稱之爲two-way-ssl)。好極了 :-)。但是,如果您的客戶盲目地信任您的服務器證書,它在技術上仍然是帶有客戶端證書身份驗證的TLS,但是由於服務器證書無法由客戶端進行檢查,所以不是雙向的,而且在大多數情況下這是一個非常糟糕的主意。不要這麼做:-(。 – NEOatNHNG

+0

通常當我編寫Java客戶端調用支持https的服務(自簽名https)時,客戶端通常會因爲默認情況下不信任證書而失敗。只是將服務器發佈的證書導入到我的類路徑中,以便服務器信任我的客戶端,我猜想通過導入證書甚至我的客戶端自動信任服務器。感謝您的回覆。 –

4

在雙向ssl客戶端請求服務器數字證書和服務器從客戶端請求相同。雖然它有點慢,但它更安全,因爲它是兩種方式。通常我們不會關注它,因爲服務器不關心客戶端的身份,但客戶端需要確定它所連接的服務器的完整性。