Základní informace o connectorech¶
Každý connector implementuje rozhraní, které specifikuje jednotlivé komunikace s daným systémem. Je možno si pro vlastní potřeby vytvořit vlastní implementaci jednotlivých konektorů. Rozhraní pro konektory jsou specifikovány v namespace RaConnection.Abstraction
.
Inicializace¶
Každá třída connetoru má konstruktor, který v parametrech přebírá položky, které se za života dané instance nemusí měnit.
CaConnector: ICaConnector:
public CaConnector(HttpClient httpClient, ILoggerFactory loggerFactory, string clientName, IGetReqIdCache? getReqIdCache, IGetCertCache? getCertCache, IGetProvCertCache? getProvCertCache)
BicaConnector: IBicaConnector:
public BicaConnector(ILoggerFactory loggerFactory, string clientName, HttpClient httpClient)
StorageConnector: IStorageConnector:
public StorageConnector(ILoggerFactory loggerFactory, string clientName, HttpClient httpClient)
Společné parametry connectorů:¶
HttpClient httpClient
- jedná se o instanci třídy HttpClient. Instance se používá na odesílání jednotlivých požadavků. Instanci není potřeba nastavovat žádné specifické hlavičky nebo další parametry. Vše si RaConnection nastaví automaticky v rámci tvorby http požadavku, který se v dané metodě posílá.string clientName
- identifikace klientské aplikace, která daný systém volá. Doporučuje se uvádět název a verzi klientské aplikace. ClientName se odesílá na cílový systém a ten validuje, zda klientská aplikace může daný systém použít. ClientName se na cílovém systému validuje pomocí regulárního výrazu.ILoggerFactory loggerFactory
- implementace poskytovatelé loggerů pro jednotlivé třídy. V rámci použití MS.Extensions.Logging a MS.Extensions.DependencyInjection v klientské aplikaci lze využít při vytváření IoC kontejneru metody .ConfigureLgging() a některého z existujících log providerů. V případě vlastního řešení je potřeba vytvořit vlastní implementaci rozhraní ILoggerFactory. Lze také do parametru předat hodnotu null (viz kapitola Logování).
CaConnector - specifické parametry:¶
CaConnector obsahuje ještě další parametry pro inicializaci cachování dotazů a odpovědí pro specifické komunikace. Více informací o možnosti cachování je dostupné v kapitole Metody třídy CaConnector, vždy u popisu metody, která cahchování umožňuje.
Vlastnosti nastavitelné za běhu klientské aplikace¶
Data předávané v parametrech nejsou dostačující aby bylo možné provádět jednotlivé komunikace. Všechny connectory ještě navíc obsahují vlastnosti, které je potřeba nastavit po získání instance a je možno je v průběhu běhu aplikace měnit. Jedná se o vlastnosti:
public string ServerUrl { get; set; }
public IOperatorSigner OperatorSigner { get; set; }
public int? RaCode { get; set; }
public AnswerFormatLanguages AnswerLanguage { get; set; } = AnswerFormatLanguages.cs;
ServerUrl
- specifikuje URL adresu daného systému (CA - QICA / SICA, BICA nebo STORAGE)OperatorSigner
- implementace rozhraníIOperatorSigner
, která jejímž úkolem je podepsat data předané na vstupu pomocí privátního klíče operátorského certifikátu. Více o podepisování požadavků je rozebráno v průběhu komunikace se systémyRaCode
- jedinečný identifikátor RAAnswerLanguage
- specifikace jazyka textových hlášek, které se můžou vyskytovat v odpovědích od systémů (např. informace o chybě).
Vlastnost ServerUrl musí být nastavena vždy. Vlastnosti OperatorSigner a RaCode jsou vyžadovány ve většině případů. Kde jsou tyto vlastnosti požadovány je detailně popsáno v následujících kapitolách.
Způsoby inicializace¶
Connnectory lze inicializovat klasickým způsobem, ale primárně jsou navrženy pro použití v kombinaci IoC a Dependency Injection od implementace Microsoft.Extensions.DependencyInjection, kdy se nejprve vloží do IoC instance třídy HttpClient a poté jednotlivé connectory.
Ukázka vložení do IoC:
services
.AddSingleton<HttpClient>()
.AddSingleton<ICaConnector, CaConnector>((services) =>
{
var httpClient = services.GetRequiredService<HttpClient>();
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
var getReqIdCache = services.GetRequiredService<IGetReqIdCache>();
var getCertCache = services.GetRequiredService<IGetCertCache>();
var getProvCertCache = services.GetRequiredService<IGetProvCertCache>();
return new CaConnector(httpClient, loggerFactory, _clientName, getReqIdCache, getCertCache,
getProvCertCache);
})
.AddSingleton<IBicaConnector, BicaConnector>((services) =>
{
var httpClient = services.GetRequiredService<HttpClient>();
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
return new BicaConnector(loggerFactory, _clientName, httpClient);
})
.AddSingleton<IStorageConnector, StorageConnector>((services) =>
{
var httpClient = services.GetRequiredService<HttpClient>();
var loggerFactory = services.GetRequiredService<ILoggerFactory>();
return new StorageConnector(loggerFactory, _clientName, httpClient);
});
Průběh komunikace se systémy I.CA¶
Komunikace mezi RA a CA probíhá pomocí XML. Knihovna RAConnection serializuje data dané komunikace do XML. Ze XML dat je potřeba vytvořit PKCS#7 data, které je poté potřeba podepsat certifikátem operátora.
Pro vytvoření PKCS#7 podepsaných dat obsahuje RAConnection rozhraní IOperatorSigner, které definuje metodu pro vytvoření a podepsání PKCS#7 dat. Instance IOperatorSigner
se nachází ve všech třídách connectorů a je potřeba ji před použitím jednotlivých metod inicializovat vlastní implementací rozhraní IOperatorSigner nebo lze využít výchozí implementaci DefaultOperatorSigner.
K podepsaným PKCS#7 datům je poté přidán nepodepsaný atribut CodeRa (identifikační kód RA), následně je hodnota vložena do těla HTTP požadavku a ten je odeslán na cílový systém.
Všechny systémy I.CA vrací odpověď ve formátu XML. Pokud nenastane chyba při komunikaci se systémem a systém je funkční, HTTP odpověď má vždy HTTP status 200 se XML daty, které obsahují buď navrácená data nebo informace o chybě, která nastala při zpracování požadavku. Pokud odpověď obsahuje chybu, načtou se data o chybě, vytvoří se nová instance výjimky CAServerException, která se posléze vyhazuje. Pokud byl požadavek zpracován úspěšně, jsou data deserializovány do návratového objektu a předány jako výstup dané metody.
Logování¶
Logování je implementováno pomocí Microsoft.Extension.Logging.Abstraction (verze 7.0.1 >=). V případě používání jiného loggeru než od MS je potřeba naimplementovat vlastní implementaci třídy ILoggerFactory.
Pokud není ani jedna z variant možná, lze v konstruktorech connectorů do parametru pro ILoggerFactory předat hodnotu null. V takovém případě se využije implementace NullLoggerFactory a knihovna nebude logovat žádné informace.
Úrovně logování¶
- Information - obsahuje základní informace o průběhu volané metody, informace o odesílaném HTTP požadavku (URL adresa, HTTP metoda apod.), základní informace o HTTP odpovědi, detailní informace o chybách.
- Debug - obsahuje to samé jako je uvedeno v Information, a navíc také loguje xml a poté pkcs#7 jednotlivých dotazů a xml odpověď přijatou od cílového systému