WinInet – použití klientského certifikátu

Pokud je třeba při SSL připojení autentizace pomocí klientského certifikátu, doporučuji použít CAPICOM. Slovy Microsoftu: Pomocí součásti CAPICOM lze digitálně podepisovat data a kód, potvrzovat digitální podpisy, balit data kvůli ochraně jejich soukromí, převádět data do nečitelného formátu, šifrovat je a dešifrovat. CAPICOM je COM objekt, který poskytuje všechny potřebné funkce pro práci se šifrováním obecně, takže implementace v Delphi je hračka.


Po stažení a instalaci CAPICOM je nejdříve nutné naimportovat do Delphi typovou knihovnu capicom.dll (v Delphi menu Project -> Import type library). Cesta ke knihovně může vypadat třeba takto: C:\Program Files\Microsoft CAPICOM 2.1.0.2 SDK\Lib\X86\capicom.dll. Po vybrání knihovny je třeba kliknout na tlačítko Create unit a knihovna s interface k CAPICOM je na světě.


Abychom mohli CAPICOM používat, musíme knihovnu ještě zaregistrovat pomocí regsvr32 (nevím, proč už to neudělal instalátor!?). Níže uvedený příklad počítá s klientským (osobním) certifikátem, který je již naimportovaný ve Windows. Pro přesnou identifikaci certifikátu se použije otisk prstu – tedy SHA1 nebo MD5 certifikátu (proměnná V). Uvedený příklad ukazuje použití certifikátu v případe SOAP spojení, ale funkci InternetSetOption lze samozřejmě použít kdekoli jinde.

uses ... CAPICOM_TLB, ...;

...

procedure TForm1.O2HTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
 Store : IStore3;
 Certs : ICertificates2;
 Cert : ICertificate2;
 CertContext : ICertContext;
 PCertContext : Pointer;
 V : String;
const
 INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84;
begin
  // otisk prstu certifikatu
  V :='39ea40791e469dff27bc958361b7cf4c137506ee';
  //inicializuj Certificate Store objekt
  Store := CoStore.Create;
  //otevrit slozku s osobnimi certifikaty s privatnimi klici
  Store.Open( CAPICOM_CURRENT_USER_STORE, 'MY', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED );
  //najdi certifikat s dannym otiskem prstu
  Certs := (Store.Certificates as ICertificates2).Find( CAPICOM_CERTIFICATE_FIND_SHA1_HASH,V, False);
  //nalezeno?
  if Certs.Count > 0 then
   begin
 v //ziskej kontext certifikatu
   Cert := IInterface( Certs.Item[ 1 ] ) as ICertificate2;
   //Cert.Display; // Zde muzete zobrazit klasicke Windows okno s certifikatem (pro kontrolu)
   CertContext := Cert as ICertContext;
   CertContext.Get_CertContext( Integer( PCertContext ) );
   //prirad certifikat k SSL spojeni
   if InternetSetOption( Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT,PCertContext,64) = False then
    begin
    // vyskytla se chyba
    ShowMessage( IntToStr(GetLastError) + '=' + SysErrorMessage(GetLastError));
   end;
  end;
end;

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*