Zabezpečená komunikace mezi službami v jazyce C#
Zabezpečení je jedním z nejdůležitějších aspektů komunikace. Aplikační architektura Reliable Services poskytuje několik předem připravených komunikačních zásobníků a nástrojů, které můžete použít ke zlepšení zabezpečení. Tento článek popisuje, jak zlepšit zabezpečení při používání vzdálené komunikace služby ve službě C#. Vychází z existujícího příkladu , který vysvětluje, jak nastavit vzdálenou komunikace pro spolehlivé služby napsané v jazyce C#.
Pokud chcete pomoct zabezpečit službu při používání vzdálené komunikace služby se službami jazyka C#, postupujte takto:
Vytvořte rozhraní,
IHelloWorldStateful
které definuje metody, které budou k dispozici pro vzdálené volání procedury ve vaší službě. Vaše služba bude používatFabricTransportServiceRemotingListener
, která je deklarována vMicrosoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime
oboru názvů. Jedná se oICommunicationListener
implementaci, která poskytuje možnosti vzdálené komunikace.public interface IHelloWorldStateful : IService { Task<string> GetHelloWorld(); } internal class HelloWorldStateful : StatefulService, IHelloWorldStateful { protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; } public Task<string> GetHelloWorld() { return Task.FromResult("Hello World!"); } }
Přidejte nastavení naslouchacího procesu a přihlašovací údaje zabezpečení.
Ujistěte se, že certifikát, který chcete použít k zabezpečení komunikace služby, je nainstalovaný na všech uzlech v clusteru.
Poznámka:
V linuxových uzlech musí být certifikát v adresáři /var/lib/sfcerts k dispozici jako soubory ve formátu PEM. Další informace najdete v tématu Umístění a formát certifikátů X.509 v uzlech Linuxu.
Existují dva způsoby, jak zadat nastavení naslouchacího procesu a přihlašovací údaje zabezpečení:
Zadejte je přímo v kódu služby:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { FabricTransportRemotingListenerSettings listenerSettings = new FabricTransportRemotingListenerSettings { MaxMessageSize = 10000000, SecurityCredentials = GetSecurityCredentials() }; return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this,listenerSettings)) }; } private static SecurityCredentials GetSecurityCredentials() { // Provide certificate details. var x509Credentials = new X509Credentials { FindType = X509FindType.FindByThumbprint, FindValue = "4FEF3950642138446CC364A396E1E881DB76B48C", StoreLocation = StoreLocation.LocalMachine, StoreName = "My", ProtectionLevel = ProtectionLevel.EncryptAndSign }; x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert"); x509Credentials.RemoteCertThumbprints.Add("9FEF3950642138446CC364A396E1E881DB76B483"); return x509Credentials; }
Zadejte je pomocí konfiguračního balíčku:
Do souboru settings.xml přidejte pojmenovaný
TransportSettings
oddíl.<Section Name="HelloWorldStatefulTransportSettings"> <Parameter Name="MaxMessageSize" Value="10000000" /> <Parameter Name="SecurityCredentialsType" Value="X509" /> <Parameter Name="CertificateFindType" Value="FindByThumbprint" /> <Parameter Name="CertificateFindValue" Value="4FEF3950642138446CC364A396E1E881DB76B48C" /> <Parameter Name="CertificateRemoteThumbprints" Value="9FEF3950642138446CC364A396E1E881DB76B483" /> <Parameter Name="CertificateStoreLocation" Value="LocalMachine" /> <Parameter Name="CertificateStoreName" Value="My" /> <Parameter Name="CertificateProtectionLevel" Value="EncryptAndSign" /> <Parameter Name="CertificateRemoteCommonNames" Value="ServiceFabric-Test-Cert" /> </Section>
V tomto případě
CreateServiceReplicaListeners
bude metoda vypadat takto:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener( context,this,FabricTransportRemotingListenerSettings .LoadFrom("HelloWorldStatefulTransportSettings"))) }; }
Pokud do souboru settings.xml přidáte
TransportSettings
oddíl,FabricTransportRemotingListenerSettings
načte ve výchozím nastavení všechna nastavení z tohoto oddílu.<!--"TransportSettings" section .--> <Section Name="TransportSettings"> ... </Section>
V tomto případě
CreateServiceReplicaListeners
bude metoda vypadat takto:protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners() { return new[] { return new[]{ new ServiceReplicaListener( (context) => new FabricTransportServiceRemotingListener(context,this))}; }; }
Při volání metod v zabezpečené službě pomocí zásobníku vzdálené komunikace místo třídy
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
k vytvoření proxy služby použijteMicrosoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory
.FabricTransportRemotingSettings
Předání , které obsahujeSecurityCredentials
.var x509Credentials = new X509Credentials { FindType = X509FindType.FindByThumbprint, FindValue = "9FEF3950642138446CC364A396E1E881DB76B483", StoreLocation = StoreLocation.LocalMachine, StoreName = "My", ProtectionLevel = ProtectionLevel.EncryptAndSign }; x509Credentials.RemoteCommonNames.Add("ServiceFabric-Test-Cert"); x509Credentials.RemoteCertThumbprints.Add("4FEF3950642138446CC364A396E1E881DB76B48C"); FabricTransportRemotingSettings transportSettings = new FabricTransportRemotingSettings { SecurityCredentials = x509Credentials, }; ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory( (c) => new FabricTransportServiceRemotingClientFactory(transportSettings)); IHelloWorldStateful client = serviceProxyFactory.CreateServiceProxy<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
Pokud je klientský kód spuštěný jako součást služby, můžete načíst
FabricTransportRemotingSettings
ze souboru settings.xml. Vytvořte oddíl HelloWorldClientTransportSettings, který je podobný kódu služby, jak je znázorněno výše. V kódu klienta proveďte následující změny:ServiceProxyFactory serviceProxyFactory = new ServiceProxyFactory( (c) => new FabricTransportServiceRemotingClientFactory(FabricTransportRemotingSettings.LoadFrom("HelloWorldClientTransportSettings"))); IHelloWorldStateful client = serviceProxyFactory.CreateServiceProxy<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
Pokud klient není spuštěný jako součást služby, můžete vytvořit soubor client_name.settings.xml ve stejném umístění, kde je client_name.exe. Pak v tomto souboru vytvořte oddíl TransportSettings.
Podobně jako v případě, že do klientského settings.xml/client_name.settings.xml přidáte
TransportSettings
oddíl,FabricTransportRemotingSettings
načte se ve výchozím nastavení všechna nastavení z tohoto oddílu.V takovém případě je dřívější kód ještě jednodušší:
IHelloWorldStateful client = ServiceProxy.Create<IHelloWorldStateful>( new Uri("fabric:/MyApplication/MyHelloWorldService")); string message = await client.GetHelloWorld();
V dalším kroku si můžete přečíst webové rozhraní API s OWIN ve spolehlivých službách.