2017-10-12 172 views
0

我正在編寫客戶端/服務器TCP程序,並希望使用TLS加密和驗證連接。我的計劃是讓客戶端將公共RSA密鑰提交給服務器,然後使用私鑰和用戶名來驗證客戶端的身份並加密連接。如何與RSA公鑰/私鑰和GnuTLS形成TLS連接?

GnuTLS文檔留下了很多不足之處,但我找到了一個很好的PSK示例,並試圖使其適用於使用RSA非對稱密鑰。在我對這個問題進行了猛烈的抨擊後,特別是文檔中沒有清楚描述的各種晦澀的微妙之處,我已經讓客戶停止抱怨「沒有找到支持的密碼套件」,但現在服務器確實如此。

在更多的互聯網搜索之後,我發現一個測試程序是GnuTLS CI的一部分,測試RSA-PSK,我意識到共享密鑰仍然是對稱的。 RSA-PSK不是我認爲的那樣。

我真的不喜歡使用對稱密鑰,因爲它需要在服務器端以純文本存儲,因此是不安全的。

但是簡要介紹一下RSA密鑰交換表明,沒有涉及用戶名,它實際上是基於證書的,並且服務器使用自己的私鑰,而所有客戶端使用相同的公鑰。因此,不可能保證客戶的身份。

花了一天的時間試圖讓TLS工作,並且厭惡重新發明輪子(這總是一種安全風險),我在這裏問的是,如果有專家誰可以告訴我如何實現我正在尋求實現。

想到的唯一解決方案是相當髒和黑客(並重新發明輪子),即在客戶端生成隨機密鑰,使用其私鑰對其進行加密並實施預先TLS握手握手它和服務器的用戶名,然後使用公鑰對其進行解密。然後,GnuTLS可以使用隨機密鑰使用正常的對稱PSK密鑰交換。

我不明白爲什麼GnuTLS不會實現像這樣的東西。我期待的是GnuTLS客戶端將用戶名發送到服務器,然後服務器通過爲加密生成密鑰並使用客戶端公鑰將其加密並將加密密鑰發送到客戶端來執行密鑰交換。客戶端使用其私鑰解密密鑰,並注意,密鑰交換安全完成,並且TLS通道已打開。

因此,在總結:

1)如何實現我需要實現(最好用的GnuTLS)?

2)爲什麼RSA-PSK不能像我期望的那樣工作,而是使用對稱密鑰和證書?

+0

在閱讀了幾次後,我仍然不知道你想做什麼。也許我們可以從基礎開始:好的舊標準服務器認證的TLS有什麼問題? –

+0

我需要驗證客戶端,而不是服務器。如果攻擊者欺騙服務器,他們什麼也得不到。我試圖實現的更像是一個SSH連接,只有某些客戶端可以連接,並且他們需要能夠證明他們的身份。我想通過公鑰驗證。這一切都在第一段中介紹。我也想避免證書籤名鏈的複雜性。 – AlastairG

+0

我也想加密數據連接。我不想使用PSK,因爲它是對稱加密。如果我們的數據庫受到攻擊,攻擊者可以訪問我們的系統(儘管如果他們可以抓取數據庫,他們也可以做其他事情,但仍然可以)。 SRP看起來很狡猾 - 沒有真正的解釋它是如何安全的。無論您是爲密鑰交換目的發送密碼還是密碼錯誤,它仍然看起來像是以明文形式發送的。 – AlastairG

回答

0

TLS不適合我試圖說明的目的。 Libssh可能是最好的解決方案,但我已經完成了一個完整的解決方案,使用libgcrypt,所以...