2013-04-05 112 views
4

我需要使用WCF,但它有一個證書,我需要禁用其身份驗證。 有誰知道我怎麼能在Delphi XE2中做到這一點?禁用證書驗證

我已經嘗試下面的代碼:

第一次嘗試:

Rio.HTTPWebNode.InvokeOptions:= [soIgnoreInvalidCerts,soAutoCheckAccessPointViaUDDI];

凡拓是THTTPRIO。

第二次嘗試:

class procedure ClasseTeste.OnBeforePost(const HTTPReqResp: THTTPReqResp; 
     Data: Pointer); 
    var 
     SecurityFlags: DWord; 
     SecurityFlagsLen: DWord; 
     Request: HINTERNET; 
     begin 
     Request := Data; 
     if soIgnoreInvalidCerts in Rio.HTTPWebNode.InvokeOptions then 
     begin 
     SecurityFlagsLen := SizeOf(SecurityFlags); 
     InternetQueryOption(Request, INTERNET_OPTION_SECURITY_FLAGS, 
     Pointer(@SecurityFlags), SecurityFlagsLen); 
     SecurityFlags := SecurityFlags or INTERNET_FLAG_IGNORE_CERT_CN_INVALID; 
     InternetSetOption(Request, INTERNET_OPTION_SECURITY_FLAGS, 
     Pointer(@SecurityFlags), SecurityFlagsLen); 
     end; 
    end; 

rio.HTTPWebNode.OnBeforePost:= ClasseTeste.OnBeforePost; 

我可以做到這一點使用C#,用下面的代碼:

channel = new ChannelFactory<WsMain.IWsInterface>("****"); 
       channel.Credentials.UserName.UserName = "*****"; 
       channel.Credentials.UserName.Password = "*****"; 
       channel.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; 
+1

不應該在服務器端禁用它嗎?我想知道是否有客戶能夠禁用認證是一種安全的行爲...... :) – 2013-04-05 19:24:32

+0

我同意你的意見,但在這種情況下,服務不是我們的。我知道可以在C#中禁用,並且我想在Delphi中執行相同的行爲。 – 2013-04-05 20:22:52

+0

我真的不知道這裏的問題:服務器上的證書是無效的(selfsigned等)還是服務器需要證書認證?我問這是因爲服務器可能有證書,但可能不需要證書認證 - 證書只能用於SSL任務。也請告訴我們你收到了什麼錯誤? – 2013-04-06 12:27:01

回答

1

添加以下行您的請求後:

SecurityFlags := SecurityFlags or SECURITY_FLAG_IGNORE_REVOCATION; 
    InternetSetOption(Request, INTERNET_OPTION_SECURITY_FLAGS, Pointer(@SecurityFlags), SecurityFlagsLen); 

哪會完成:

procedure TForm1.RIO_OnBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); 
    var 
    SecurityFlags: DWord; 
    SecurityFlagsLen: DWord; 
    Request: HINTERNET; 

begin 
    Request := Data; 

    SecurityFlagsLen := SizeOf(SecurityFlags); 
    InternetQueryOption(Request, INTERNET_OPTION_SECURITY_FLAGS, Pointer(@SecurityFlags), SecurityFlagsLen); 

    SecurityFlags := SecurityFlags or SECURITY_FLAG_IGNORE_UNKNOWN_CA; 
    InternetSetOption(Request, INTERNET_OPTION_SECURITY_FLAGS, Pointer(@SecurityFlags), SecurityFlagsLen); 

    // It solved my problem 
    SecurityFlags := SecurityFlags or SECURITY_FLAG_IGNORE_REVOCATION; 
    InternetSetOption(Request, INTERNET_OPTION_SECURITY_FLAGS, Pointer(@SecurityFlags), SecurityFlagsLen); 


end;