2011-05-29 37 views
4

我正在嘗試使用OpenSSL實現DTLS服務器。我可以通過獲取應用程序數據,但是當客戶端和服務器已經協商時,我注意到服務器上的session_id爲空。DTLS中的會話ID(OpenSSL)

檢查代碼,更具體地說是ssl_sess.c,session_id_length顯式設置爲零,註釋參考RFC4507。

我的問題是什麼時候連接被協商,我可以使用什麼ID來唯一標識客戶端?

我注意到,在客戶端,會話ID似乎是從票據計算的,但這似乎並沒有發生在服務器上。

回答

3

與使用任何基於數據報的應用程序相同。每RFC 4347(數據報傳輸層安全):

注意與IPsec的,DTLS記錄 不包含任何關聯 標識符。應用程序必須 安排在 關聯之間進行復用。 使用UDP,這大概是 與主機/端口號完成。

(重點煤礦)


從您的評論,它看起來像你實際上是試圖跨越「會話」(一種模糊的,但可能適用的描述符)保持狀態。跨「會話」維護狀態是一個應用層問題。 (D)TLS是傳輸層(因此名稱)。

嚴格來說,在(D)TLS上運行的應用程序需要有自己的「客戶端ID」的概念,由客戶端發送到服務器。根據應用程序的性質和安全要求(用戶名+密碼當然是最常見的),有無數的方法可以解決這個問題。

另一種選擇是使用客戶端證書作爲獨立應用程序層ID的替代品,但仍需要應用程序層瞭解正在進行的操作並將客戶端證書與永久狀態信息相關聯。令人煩惱的是,這需要爲每個客戶管理一個單獨的證書。這是非常沉重的,大多數人不會採取這種方式。它具有優點,例如用戶不能準確地選擇一個錯誤的密碼或將其寫在他們的顯示器上的便條上。另一方面,如果有人訪問證書存儲的文件,則無論如何都是遊戲。

當然,很多書可能是(和一直以極大的頻率)寫在安全和認證的主題...

+0

謝謝您的回答!如果客戶端更改IP地址和/或源端口,則無法告知客戶端以前是否已連接?我正在尋找的是能夠爲每個獨特的客戶端設置一個狀態(外部DTLS),當客戶端回來時,我希望能夠看到該狀態。 – 2011-05-30 11:26:47

+0

@Fredrik:我想我知道你現在掛掉的地方。檢查我更新的答案。 – 2011-05-30 12:06:48

+0

謝謝,我想我一直有點含糊。無論身份驗證如果我有一個會話ID,我會希望會話ID在縮短握手後保持不變。現在,據我所知,如果客戶端執行縮略握手,我無法查找舊會話數據。使用會話ID,我可以將應用程序數據鍵入會話ID並查看。如果你能證明我錯了,你已經救了我的一天! – 2011-05-30 15:04:42