簡體   English   中英

使用SSL加密創建idhttpserver

[英]creating idhttpserver with ssl encryption

我對delphi不太滿意,但是基於一些示例,我設法創建了一個不超過10個用戶的簡單http服務器。
有2個主要問題,我尚不知道如何解決。

  1. 驗證,管理用戶的正確方法-會話
  2. 主要問題是,連接必須安全,因此需要SSL加密,如何實現?

我發現的與idhttpserver和openssl有關的任何示例都不十分完整,也與Indy的舊版本無關。

我目前正在使用帶有Indy 10組件的Delphi XE2。

驗證,管理用戶的正確方法-會話

TIdHTTPServer為您管理HTTP會話,如果你設置的TIdHTTPServer.SessionState屬性為true(這是默認為false)。 TIdHTTPServer使用cookie進行會話管理,因此您的客戶端需要啟用cookie。

身份驗證必須手動執行,但是如何執行取決於您的客戶端使用的是基於HTTP的身份驗證還是基於HTML的身份驗證。

對於HTTP身份驗證,有可用的ARequestInfo.UserNameARequestInfo.Password屬性。 如果無效,則將適當的401響應發送回客戶端(如果將AResponseInfo.AuthRealm屬性設置為非空字符串, TIdHTTPServer將為您發送401響應)。 默認情況下, TIdHTTPServer僅支持BASIC身份驗證。 如果要支持其他身份驗證方案,則必須使用TIdHTTPServer.OnParseAuthentication事件,並手動發送401答復,以便可以發送回適當的WWW-Authenticate標頭。 無論哪種方式,如果客戶端均已驗證,則可以使用HTTP會話來使客戶端在兩次請求之間保持登錄狀態。 AResponseInfo.SessionAResponseInfo.Session屬性指向當前會話。 如果TIdHTTPServer.AutoStartSession為true(默認情況下為false),則TIdHTTPServer自動創建新會話。 否則,您可以在需要時自己調用TIdHTTPServer.CreateSession() TIdHTTPSession具有一個Content屬性,您可以在其中存儲特定於會話的數據。或者您可以從TIdHTTPSession派生一個新類,然后使用TIdHTTPServer.OnCreateSession事件創建該類的實例。

對於HTML身份驗證,根據配置HTML的方式,您有兩種選擇:

  1. 如果您的HTML <form>標記不具有enctype屬性,或者將其設置為application/x-www-webform-urlencoded ,則TIdHTTPServer會將原始ARequestInfo.FormParams表單數據存儲在ARequestInfo.FormParams屬性中,並且TIdHTTPServer.ParseParams為true (默認情況下),數據也將為您解析到ARequestInfo.Params屬性中。

  2. 如果您的HTML <form>標記的enctype屬性設置為multipart/form-data ,那么您將必須手動解析ARequestInfo.PostStream的內容,因為TIdHTTPServer尚未為您解析該數據(示例已發布多次)在許多不同的論壇上討論過如何使用Indy的TIdMessageDecoderMIME類手動解析該數據)。 默認情況下, ARequestInfo.PostStream指向TMemoryStream對象。 如果需要,可以使用TIdHTTPServer.OnCreatePostStream事件創建不同的TStream派生類的實例。

主要問題是,連接必須安全,因此需要SSL加密,如何實現?

激活服務器之前:

  1. TIdServerIOHandlerSSLBase派生的組件(例如TIdServerIOHandlerSSLOpenSSL分配給TIdHTTPServer.IOHandler屬性,並根據需要進行配置(證書,對等驗證,SSL版本等)。 對於OpenSSL,如果尚未在目標OS上預先安裝2個OpenSSL庫二進制文件libeay32.dllssleay32.dll (或非Windows平台等效文件),則必須將它們與應用程序一起部署。希望確保您的應用使用特定版本的OpenSSL。 目前,OpenSSL是Indy本地支持的唯一加密方法,但是有可用的與Indy兼容的第三方解決方案,例如EldoS SecureBlackbox

  2. 填寫TIdHTTPServer.Binding屬性,並TIdHTTPServer.Binding綁定所需的HTTPS端口(443是默認的HTTPS端口)。 通常,您應該創建2個綁定,一個用於HTTP端口80,一個用於HTTPS端口443。在OnCommand...處理程序中,如果收到要求進行SSL / TLS加密的請求,則可以檢查該請求是在哪個端口上進行的。 ( AContext.Binding.Port ),如果不是HTTPS,則重定向( AResponseInfo.Redirect() ),客戶端在HTTPS端口上重試請求。

  3. TIdHTTPServer.OnQuerySSLPort事件分配一個處理程序,並使其APort參數與您的HTTPS端口匹配時,將其VUseSSL參數設置為True。 從SVN版本5461開始更新 ,如果您唯一的HTTPS端口是443 不再需要 OnQuerySSLPort處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM