Ver Mensaje Individual
  #3180  
Antiguo 13-09-2021
razorxxx razorxxx is offline
Miembro
 
Registrado: jul 2015
Posts: 19
Reputación: 0
razorxxx Va por buen camino
Problemas con HTTPRIOBeforePost en Delphi Sydney

Cita:
Empezado por didou Ver Mensaje
Buenas tardes, me he actualizado a Delphi Sydney (10.4) y resulta que el evento HTTPRIOBeforePost ha cambiado,
antes los argumentos eran (CONST HTTPReqResp: THTTPReqResp; Data: Pointer) y ahora (const HTTPReqResp: THTTPReqResp; Client: THTTPClient)

la función InternetSetOption que se usa dentro del evento antes se le pasaba como parametros InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, nil, Sizeof(CERT_CONTEXT))
y ahora InternetSetOption(Client, INTERNET_OPTION_CLIENT_CERT_CONTEXT, nil, Sizeof(CERT_CONTEXT))
y devuelve siempre false o sea "Error, Internet SSL certificate"

Mi fuente con lo anterior a delphi 10.4 comentado:

Código Delphi [-]
procedure TGestionSII_1_1EnviarDatCli.HTTPRIOBeforePost(const HTTPReqResp: THTTPReqResp; Client: THTTPClient);//Data: Pointer);
var
  Store : IStore;
  Certs : ICertificates;
  Cert : ICertificate2;
  CertContext : ICertContext;
  PCertContext : PCCERT_CONTEXT;
  vNombreCertificado: OleVariant;
const
  INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
begin
  vNombreCertificado:= HdParam(parSfnCertificadoNombreSII).AsString;
  Store := CoStore.Create;
  Store.Open(CAPICOM_CURRENT_USER_STORE, 'MY', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED );
  Certs:=Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, vNombreCertificado, False ); { Buscar certificado por nombre }
  if Certs.Count > 0 then
  begin
    Cert := IInterface(Certs.Item[1]) as ICertificate2;
    CertContext := Cert as ICertContext;
    CertContext.Get_CertContext(Integer(PCertContext));
//    if not InternetSetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) then
    if not InternetSetOption(Client, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) then
      BoxMsg('Error, Internet SSL certificate');
  end else
    BoxMsg('Error, NO HAY CERTIFICADO');
end;
Alguien me puede ayudar por favor, gracias.
Buenas a todos! Me pasa lo mismo que a este señor. Al parecer, el problema viene desde Delphi Rio (10.3), con la 10.2 funcionaba. Efectivamente, el procedimiento ha cambiado y si no añades la unit System.Net.HttpClient ni siquiera te va a compilar (unit que debería añadirse sola cuando añades un objeto HTTPRio en vista diseño).

En otros foros algunos comentan la posibilidad de sustituir la WinInet por WinHTTP, y la función InternetSetOption por WinHttpSetOption:
Código:
If WinHttpSetOption(Client, WINHTTP_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof(CERT_CONTEXT)) = False Then ...
Sin embargo, el problema persiste.

¿Alguien lo ha conseguido solucionar?

Gracias de antemano.
Responder Con Cita