Web services 禁用证书验证

Web services 禁用证书验证,web-services,delphi,delphi-xe2,x509certificate,Web Services,Delphi,Delphi Xe2,X509certificate,我需要使用WCF,但它有一个证书,我需要禁用它的身份验证。 有人知道如何在Delphi XE2中实现这一点吗 我已经尝试了以下代码: 第一次尝试: Rio.HTTPWebNode.InvokeOptions:=[soIgnoreInvalidCerts,SOAutocheckAccessPointViaudi]; 里约热内卢是一个城市 第二次尝试: class procedure ClasseTeste.OnBeforePost(const HTTPReqResp: THTTPReq

我需要使用WCF,但它有一个证书,我需要禁用它的身份验证。 有人知道如何在Delphi XE2中实现这一点吗

我已经尝试了以下代码:

第一次尝试:


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

里约热内卢是一个城市

第二次尝试:

    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;
channel=newchannelfactory(“****”);
channel.Credentials.UserName.UserName=“*******”;
channel.Credentials.UserName.Password=“*******”;
channel.Credentials.ServiceCertificate.Authentication.CertificateValidationMode=System.ServiceModel.Security.X509CertificateValidationMode.None;

在您的请求后添加以下行:

  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;

是否应该在服务器端禁用它?我想知道让客户端禁用认证是否是一种安全行为…:)我同意你的看法,但在这种情况下,服务不是我们的。我知道可以在C#中禁用,我想在Delphi中执行同样的操作。我并不真正理解这个问题:服务器上的证书是否以某种方式无效(自签名等),或者服务器需要证书身份验证?我这样问是因为服务器可以有证书,但可能不需要证书身份验证-证书只能用于SSL任务。另外,请告诉我们您遇到了什么错误?服务器需要身份验证。WS的所有者告诉我,在访问其metods之前必须禁用身份验证,这是使consume工作的唯一方法。如果没有remove certificate require,响应只是一个简单的超时,而在C#(removing require)中,返回是ok的。