Zabezpečená komunikace mezi službami ve službě C#
Zabezpečení je jedním z nejdůležitějších aspektů komunikace. Architektura aplikace 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žití vzdálené komunikace se službami C#, postupujte takto:
Vytvořte rozhraní ,
IHelloWorldStateful
které definuje metody, které budou k dispozici pro vzdálené volání procedur 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 je certifikát, který chcete použít k zabezpečení komunikace služby, nainstalovaný na všech uzlech v clusteru.
Poznámka
Na linuxových uzlech musí být certifikát v adresáři /var/lib/sfcerts ve formátu PEM. Další informace najdete v tématu Umístění a formát certifikátů X.509 na uzlech Linuxu.
Nastavení naslouchacího procesu a přihlašovací údaje zabezpečení můžete zadat dvěma způsoby:
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 použití
Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy
třídy 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 kód klienta spuštěný jako součást služby, můžete načíst
FabricTransportRemotingSettings
ze souboru settings.xml. Vytvořte část HelloWorldClientTransportSettings, která se podobá kódu služby, jak je znázorněno výše. Proveďte následující změny v kódu klienta: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 u služby platí, že pokud přidáte
TransportSettings
oddíl v klientském settings.xml/client_name.settings.xml,FabricTransportRemotingSettings
načte 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();
Jako další krok si přečtěte článek Webové rozhraní API s OWIN ve službě Reliable Services.