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ář