Amigos, é Urgente. Preciso Autenticar comunicação para webservice(soap) via capicom.dll achei exemplos em sites internacionais. mas não consigo implementar a rotina.
Aqui vai: unit main; (* Example Delphi SOAP using client side certificates. According to MSDN you'll need at least IE 5.5. JwaWinCrypt taken from: http://members.chello.nl/m.vanbrakel2/ CAPICOM_TLB import unit from CAPICOM.DLL. Download from: http://www.microsoft.com/downloads/details.aspx?FamilyID=860ee43a-a843-4 62f-abb5-ff88ea5896f6&DisplayLang=en Author: Martijn Brinkers *) interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, SignCertificate (* my soap service wrapper, use your own *), SOAPHTTPClient, SOAPHTTPTrans, WinINet, CAPICOM_TLB, JwaWinCrypt; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure OnBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84; procedure TForm1.Button1Click(Sender: TObject); var CA : RemoteCA; Rio : THTTPRIO; begin (* create our own THTTPRIO so we can set the OnBeforePost event handler *) Rio := THTTPRIO.Create( Nil ); Rio.HTTPWebNode.OnBeforePost := OnBeforePost; (* get some instance of the SOAP wrapper. Use your own generated one *) CA := GetRemoteCA( False, 'https://localhost:8005/secure/signcertificate', Rio ); (* call some soap function *) ShowMessage( CA.ping ); end; procedure TForm1.OnBeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer); var Store : IStore; Certs : ICertificates; Cert : ICertificate2; CertContext : ICertContext; PCertContext : PCCERT_CONTEXT; V : OleVariant; begin (* thumbprint of the certificate to use. Look at CAPICOM docs to see how to find certs using other Id's *) V := '07C1E1CA997417E1CFF235FDD39C3093B7A827D2'; (* create Certificate store object *) Store := CoStore.Create; (* open the My Store containing certs with private keys *) Store.Open( CAPICOM_CURRENT_USER_STORE, 'MY', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED ); (* find the certificate with the given thumbprint *) Certs := Store.Certificates.Find( CAPICOM_CERTIFICATE_FIND_SHA1_HASH, V, False ); (* any certificates found? *) if Certs.Count > 0 then begin (* get the certificate context *) Cert := IInterface( Certs.Item[ 1 ] ) as ICertificate2; CertContext := Cert as ICertContext; CertContext.Get_CertContext( Integer( PCertContext ) ); (* set the certificate to use for the SSL connection *) if InternetSetOption( Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT, PCertContext, Sizeof( CERT_CONTEXT ) ) = False then begin ShowMessage( 'Something went wrong' ); end; end; end;