2011-04-19 16 views
6

對於我正在編寫的程序,我想使用TLS(或類似的東西)來封裝我的應用程序的協議。這將盡量減少我必須做的工作量以及我可能意外創建的漏洞數量。通過TLS與Java中的Web of Trust進行加密和身份驗證

我的程序設計爲點對點,儘管一個或多個服務器提供一些服務來幫助一個用戶找到另一個(它註冊IP地址/端口組合),但除此之外別無其他。我想讓這個系統非常容錯,因此讓這些服務器充當證書頒發機構是不可接受的,因爲妥協服務器或其密鑰會影響太多用戶。因此我計劃使用信任網。

使用TLS的主要問題是原始TLS 1.2規範(RFC 5246)沒有規定使用OpenPGP證書。它似乎非常以x.509爲中心。 RFC 6091廢棄了RFC 5081並且擴展了RFC 5246,爲我所需要的TLS的擴展做了規定。問題是我不認爲BouncyCastle實現了這個擴展,我找不到一個Java加密庫。我也不想寫我自己/爲卑詩省做出貢獻,因爲我不會犯錯,而且我也很懶。

此問題的另一個問題是BouncyCastle提供了「輕量級客戶端TLS API」,但由於該軟件是P2P,服務器端API也是必需的,因此我可以使用TLS使其相信對等發起連接是客戶端。我非常肯定,一旦握手完成,它就是一樣的。

問題: 有沒有什麼辦法可以使用TLS(我非常懷疑)?是否有像TLS這樣的協議是爲P2P設計的,或者至少可以以這種方式運行(比如我相信TLS可以),但是可以與OpenPGP證書一起使用?如果兩者都不是這樣,我是否應該追求在this question中解釋的想法,並實施我自己的層從TLS的概念?

鏈接的RFC:RFC 5246RFC 6091

回答

1

在TLS中,X.509的部分實際上是不透明的斑點處理:

  • 服務器發送其證書(以及一些輔助證書,如果它希望所以)作爲(一列)不透明的字節字符串(三字節長度,隨後是作爲任意字節的編碼證書)。
  • 當服務器要求公鑰客戶端身份驗證時,它會發送一個「名稱」列表,該列表應該是服務器將識別的根CA的編碼X.500名稱 - 在那裏再次出現不透明blob(二維)字節長度)。
  • 客戶端在(如果)發送證書(鏈)時使用與服務器相同的格式。

由於TLS的定義,客戶端和服務器都應該使用peer的公鑰,他們得到以任何方式,他們認爲合適而這大多是出於TLS規範的範圍:證書交換了電線被視爲僅僅幫手。因此,在這些blob中實際發送OpenPGP編碼的公鑰時,只要客戶端和服務器都期望它,那麼就沒有問題了 - 既然您控制了兩者的代碼,這應該不成問題。

然後,您的問題「簡單」成爲一個讓TLS實現接受給你的blobs而不窒息他們。我知道沒有現成的純Java TLS實現可以適合賬單,因此您可能需要編寫一些代碼 - 但我強烈建議您除了處理證書blob之外,不要提供TLS協議詳細信息。這些東西都是微妙的,弱點很容易創建...

+0

不幸的是,這是不正確的。 TLS握手需要解析證書。這是RFC 6091擴展到TLS的原因。 – Nikos 2011-04-20 07:52:28

+0

實際上我實現了TLS客戶端和服務器,它們本身並沒有解析證書。所以這是可能的。當客戶端收到服務器證書時,它將blob交給一個外部回調函數,後者發回公鑰以供使用 - 在我的情況下,回調函數將blob解釋爲X.509證書(它被解析和驗證),但它確實可以解釋它們,否則甚至將它們丟棄並使用硬編碼的服務器公鑰,這在一些設置中是有效的。 – 2011-04-20 11:54:36

+0

那麼,您的實現將證書作爲blob處理的事實並不能消除TLS解析這些證書的要求。你只是把它委託給一個回調,但仍然需要解析來完成協議。 – Nikos 2011-04-20 12:07:40

4

我知道支持RFC 6091(即TLS與openpgp證書)唯一的庫是GnuTLS,但我不知道你是否可以使用類似的東西在Java中。或者,您可以複製SSH語義,您可以使用自簽名的 X.509證書存儲對等方的公鑰。

1

據我所知,太陽/ Oracle的JSSE實現只與X.509 TrustManagers交易(你可以自定義處理某些擴展,但仍期望結構有效的X.509證書。

它可能有可能使用Java的安全API來實現RFC 6091,但我不知道如何,它肯定比調整TrustManagers更多的工作,因爲你必須深入研究Java的TLS實現

或者,如果是用於定製服務器,則可以將PGP證書中的密鑰材料重新用於X.509證書,並將初始PGP證書(及其所有簽名)作爲Blob存儲在客戶中tom X.509擴展(因爲它或多或少已完成here)。這裏的問題是互操作性,因爲這樣的擴展不是標準。在Java中實現能夠理解擴展的TrustManager是絕對可行的,您不需要深入研究Java的TLS堆棧的內部,您只需處理自定義TrustManagers以初始化您的SSLContext。

+0

我也將被迫使用這種方法(定製X509擴展中的blob),否則我將不得不編寫自定義的TLS實現或者破解已經存在的東西 - 而且這不是我現在可以做的事情。 – 2013-10-12 10:06:46

相關問題