Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services THttpRio https(Wininet)带有错误\u INTERNET\u客户端\u身份验证\u证书\u所需错误消息_Web Services_Delphi_Ssl_Delphi Xe7 - Fatal编程技术网

Web services THttpRio https(Wininet)带有错误\u INTERNET\u客户端\u身份验证\u证书\u所需错误消息

Web services THttpRio https(Wininet)带有错误\u INTERNET\u客户端\u身份验证\u证书\u所需错误消息,web-services,delphi,ssl,delphi-xe7,Web Services,Delphi,Ssl,Delphi Xe7,我在没有安装证书的PC中使用Delphi XE7,win 8.1 我有下一个Web服务 调用web服务时,在Delphi XE7中会出现以下异常: “完成客户端身份验证需要证书-URL:-SOAPAction:” 连接没有被端口阻塞,正如我尝试使用SOAPUI(java)并从这个web服务获得响应一样 我试图使用AltovaXMLSpy,但得到了一个类似于DelphiXe7的错误 为什么SoapUI在XE7和XML SPY存在证书问题时工作?最可能的情况是,证书位于本地系统的根证书存储(受信任的

我在没有安装证书的PC中使用Delphi XE7,win 8.1

我有下一个Web服务

调用web服务时,在Delphi XE7中会出现以下异常: “完成客户端身份验证需要证书-URL:-SOAPAction:”

连接没有被端口阻塞,正如我尝试使用SOAPUI(java)并从这个web服务获得响应一样

我试图使用AltovaXMLSpy,但得到了一个类似于DelphiXe7的错误


为什么SoapUI在XE7和XML SPY存在证书问题时工作?

最可能的情况是,证书位于本地系统的根证书存储(受信任的根证书)中

默认情况下,THTTPRIO不会在Delphi中加载这些证书(因此,它找不到要使用的正确证书),相反,它会在“我的证书存储”中查找当前用户。要强制组件使用根证书存储,必须提供OnBeforePost,以便它可以打开证书实际存在的正确存储

procedure Form1.OnBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);

const
  CERT_STORE_PROV_SYSTEM_A   = LPCSTR(9);
  CERT_STORE_PROV_SYSTEM_W   = LPCSTR(10);
  {$IFDEF UNICODE}
  CERT_STORE_PROV_SYSTEM     = CERT_STORE_PROV_SYSTEM_W;
  {$ELSE}
  CERT_STORE_PROV_SYSTEM     = CERT_STORE_PROV_SYSTEM_A;
  {$ENDIF}


  CERT_STORE_NO_CRYPT_RELEASE_FLAG            = $00000001;
  CERT_STORE_SET_LOCALIZED_NAME_FLAG          = $00000002;
  CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = $00000004;
  CERT_STORE_DELETE_FLAG                      = $00000010;
  CERT_STORE_MANIFOLD_FLAG                    = $00000100;
  CERT_STORE_ENUM_ARCHIVED_FLAG               = $00000200;
  CERT_STORE_UPDATE_KEYID_FLAG                = $00000400;
  CERT_STORE_READONLY_FLAG                    = $00008000;
  CERT_STORE_OPEN_EXISTING_FLAG               = $00004000;
  CERT_STORE_CREATE_NEW_FLAG                  = $00002000;
  CERT_STORE_MAXIMUM_ALLOWED_FLAG             = $00001000;

  CERT_SYSTEM_STORE_CURRENT_USER_ID  = 1;
  CERT_SYSTEM_STORE_LOCAL_MACHINE_ID = 2;
  CERT_SYSTEM_STORE_LOCATION_SHIFT   = 16;

  CERT_SYSTEM_STORE_CURRENT_SERVICE_ID  = 4;
  CERT_SYSTEM_STORE_SERVICES_ID         = 5;
  CERT_SYSTEM_STORE_USERS_ID            = 6;

  CERT_SYSTEM_STORE_CURRENT_USER    = CERT_SYSTEM_STORE_CURRENT_USER_ID shl CERT_SYSTEM_STORE_LOCATION_SHIFT;
  CERT_SYSTEM_STORE_LOCAL_MACHINE   = CERT_SYSTEM_STORE_LOCAL_MACHINE_ID shl CERT_SYSTEM_STORE_LOCATION_SHIFT;
  CERT_SYSTEM_STORE_CURRENT_SERVICE = CERT_SYSTEM_STORE_CURRENT_SERVICE_ID shl CERT_SYSTEM_STORE_LOCATION_SHIFT;
  CERT_SYSTEM_STORE_SERVICES        = CERT_SYSTEM_STORE_SERVICES_ID shl CERT_SYSTEM_STORE_LOCATION_SHIFT;
  CERT_SYSTEM_STORE_USERS           = CERT_SYSTEM_STORE_USERS_ID shl CERT_SYSTEM_STORE_LOCATION_SHIFT;

  {$IFDEF UNICODE}
  CERT_STORE:PWChar = 'Root';
  {$ELSE}
  CERT_STORE:PAnsiChar = 'Root';
  {$ENDIF}

var
  HTTPRStore: IClientCertInfo;
  hStore: pointer;
  Flags: cardinal;

begin
  HTTPReqResp.InvokeOptions:=[soPickFirstClientCertificate,soIgnoreInvalidCerts];

  if UseSystemCertStore
    then
      begin
        Flags:=CERT_STORE_OPEN_EXISTING_FLAG or CERT_STORE_READONLY_FLAG or CERT_SYSTEM_STORE_LOCAL_MACHINE or CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG;
        HTTPRStore:=HTTPReqResp as IClientCertInfo;
        try
          hStore:=CertOpenStore(CERT_STORE_PROV_SYSTEM,
            0,
            0,
            Flags,
            CERT_STORE);
          HTTPRStore.SetCertStore(hStore);
        finally
          HTTPRStore:=nil;
        end;
      end;
end;

Web服务正在使用基于证书的身份验证,您需要安装/提供Web服务信任的证书。请检查更多线索。虽然我没有安装证书,但SoapUI工作得很好。当我使用SoapUI发送请求时,我有一个答案,它不会抱怨缺少证书。那么,为什么要使用HTTPRio(Delphi)和XML SPY在Web服务中遇到需要证书的消息问题?LuizIn SoapUI,转到首选项页面的SSL设置选项卡,并验证您没有附加证书。SoapUI可以附加.pfx或.cer文件中的证书,并且该证书不必安装在计算机上。这将是一个简单的答案。I我已经检查了SoapUI中的首选项页面,但我没有安装certificate。正如我所说,它工作得很好。我发布了一个请求,收到了正确的响应。对于Delphi XE7和XMLSPY,我得到的响应是,完成客户端身份验证需要证书。