Certifikát zabezpečení zpráv
Ukázka MessageSecurity ukazuje, jak implementovat aplikaci, která používá WS-Security s ověřováním certifikátu X.509 v3 pro klienta a vyžaduje ověření serveru pomocí certifikátu X.509 v3 serveru. Tato ukázka používá výchozí nastavení tak, aby všechny zprávy aplikace mezi klientem a serverem byly podepsány a zašifrovány. Tato ukázka je založená na WSHttpBinding a skládá se z programu konzoly klienta a knihovny služeb hostované službou IIS (Internet Information Services). Služba implementuje kontrakt, který definuje komunikační vzor žádosti a odpovědi.
Poznámka
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
Ukázka ukazuje řízení ověřování pomocí konfigurace a způsobu získání identity volajícího z kontextu zabezpečení, jak je znázorněno v následujícím ukázkovém kódu.
public class CalculatorService : ICalculator
{
public string GetCallerIdentity()
{
// The client certificate is not mapped to a Windows identity by default.
// ServiceSecurityContext.PrimaryIdentity is populated based on the information
// in the certificate that the client used to authenticate itself to the service.
return ServiceSecurityContext.Current.PrimaryIdentity.Name;
}
...
}
Služba zveřejňuje jeden koncový bod pro komunikaci se službou a jeden koncový bod pro zveřejnění dokumentu WSDL služby pomocí protokolu WS-MetadataExchange definovaného pomocí konfiguračního souboru (Web.config). Koncový bod se skládá z adresy, vazby a kontraktu. Vazba je nakonfigurována se standardním prvkem <wsHttpBinding>, který používá zabezpečení zpráv ve výchozím nastavení. Tato ukázka nastaví atribut clientCredentialType
na certifikát tak, aby vyžadoval ověření klienta.
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="wsHttpBinding"/>
</protocolMapping>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Certificate.
-->
<binding>
<security mode ="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Chování určuje přihlašovací údaje služby, které se použijí při ověření služby klientem. Název subjektu certifikátu serveru je zadán v atributu findValue
v elementu <serviceCredentials>.
<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<!--
The serviceCredentials behavior allows one to define a service certificate.
A service certificate is used by the service to authenticate itself to its clients and to provide message protection.
This configuration references the "localhost" certificate installed during the setup instructions.
-->
<serviceCredentials>
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
<clientCertificate>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certification authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Konfigurace koncového bodu klienta se skládá z absolutní adresy koncového bodu služby, vazby a kontraktu. Vazba klienta je nakonfigurovaná s odpovídajícím bezpečnostním režimem a odpovídajícím režimem autentizace. Při spuštění ve scénáři mezi počítači se ujistěte, že se odpovídajícím způsobem změní adresa koncového bodu služby.
<system.serviceModel>
<client>
<!-- Use a behavior to configure the client certificate to present to the service. -->
<endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" behaviorConfiguration="ClientCertificateBehavior" contract="Microsoft.Samples.Certificate.ICalculator"/>
</client>
<bindings>
<wsHttpBinding>
<!--
This configuration defines the security mode as Message and
the clientCredentialType as Certificate.
-->
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
...
</system.serviceModel>
Implementace klienta může certifikát nastavit tak, aby se používal, a to buď prostřednictvím konfiguračního souboru, nebo prostřednictvím kódu. Následující ukázka ukazuje, jak nastavit certifikát pro použití v konfiguračním souboru.
<system.serviceModel>
...
<behaviors>
<endpointBehaviors>
<behavior name="ClientCertificateBehavior">
<!--
The clientCredentials behavior allows one to define a certificate to present to a service.
A certificate is used by a client to authenticate itself to the service and provide message integrity.
This configuration references the "client.com" certificate installed during the setup instructions.
-->
<clientCredentials>
<clientCertificate findValue="client.com" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
<serviceCertificate>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it will be trusted without performing a
validation of the certificate's issuer chain. This setting is used here for convenience so that the
sample can be run without having to have certificates issued by a certificate authority (CA).
This setting is less secure than the default, ChainTrust. The security implications of this
setting should be carefully considered before using PeerOrChainTrust in production code.
-->
<authentication certificateValidationMode="PeerOrChainTrust"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Následující ukázka ukazuje, jak volat službu v programu.
// Create a client.
CalculatorClient client = new CalculatorClient();
// Call the GetCallerIdentity service operation.
Console.WriteLine(client.GetCallerIdentity());
...
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.
CN=client.com
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
Dávkový soubor Setup.bat, který je součástí ukázek zabezpečení zpráv, umožňuje nakonfigurovat klienta a server s relevantními certifikáty pro spuštění hostované aplikace, která vyžaduje zabezpečení založené na certifikátech. Dávkový soubor lze spustit ve třech režimech. Chcete-li spustit v režimu jednoho počítače, napište setup.bat v příkazovém řádku pro vývojáře pro Visual Studio; pro režim služby napište setup.bat služby; a pro klientský režim napište setup.bat klient. Při spuštění ukázky na počítačích použijte režim klienta a serveru. Podrobnosti najdete v postupu nastavení na konci tohoto tématu. Níže najdete stručný přehled různých částí dávkových souborů, aby je bylo možné upravit tak, aby běžely v příslušné konfiguraci:
Vytvoření klientského certifikátu
Následující řádek v dávkovém souboru vytvoří klientský certifikát. Zadaný název klienta se používá v názvu subjektu vytvořeného certifikátu. Certifikát je uložen v úložišti
My
na umístěníCurrentUser
.echo ************ echo making client cert echo ************ makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
Instalace klientského certifikátu do úložiště důvěryhodných certifikátů serveru
Následující řádek v dávkovém souboru zkopíruje klientský certifikát do úložiště TrustedPeople serveru, aby mohl server učinit relevantní rozhodnutí o důvěře nebo nedůvěře. Aby certifikát nainstalovaný v úložišti TrustedPeople důvěřoval službě Windows Communication Foundation (WCF), musí být režim ověření klientského certifikátu nastaven na
PeerOrChainTrust
neboPeerTrust
. Informace o tom, jak to lze provést pomocí konfiguračního souboru, najdete v předchozí ukázce konfigurace služby.echo ************ echo copying client cert to server's LocalMachine store echo ************ certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople
Vytvoření certifikátu serveru
Následující řádky z dávkového souboru Setup.bat vytvoří certifikát serveru, který se má použít.
echo ************ echo Server cert setup starting echo %SERVER_NAME% echo ************ echo making server cert echo ************ makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
Proměnná %SERVER_NAME% určuje název serveru. Certifikát je uložen v úložišti LocalMachine. Pokud je dávkový soubor Setup.bat spuštěn s argumentem služby (například setup.bat služba), %SERVER_NAME% obsahuje plně kvalifikovaný název domény počítače. Jinak se výchozí hodnota nastaví na localhost.
Instalace certifikátu serveru do důvěryhodného úložiště certifikátů klienta
Následující řádek zkopíruje certifikát serveru do úložiště důvěryhodných osob klienta. Tento krok je povinný, protože certifikáty generované Makecert.exe nejsou implicitně důvěryhodné klientským systémem. Pokud už máte certifikát, který je kořenový v kořenovém certifikátu klienta ( například certifikát vydaný Microsoftem), tento krok naplnění úložiště klientských certifikátů certifikátem pomocí certifikátu serveru se nevyžaduje.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Udělení oprávnění k privátnímu klíči certifikátu
Následující řádky v souboru Setup.bat vytvoří certifikát serveru uložený v úložišti LocalMachine přístupný pro účet pracovního procesu ASP.NET.
echo ************ echo setting privileges on server certificates echo ************ for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R iisreset
Poznámka
Pokud používáte neamerickou anglickou edici systému Windows, musíte upravit soubor Setup.bat a nahradit název účtu "NT AUTHORITY\NETWORK SERVICE" vaším regionálním ekvivalentem.
Poznámka
Nástroje použité v tomto dávkovém souboru jsou umístěné v souboru C:\Program Files\Microsoft Visual Studio 8\Common7\tools nebo C:\Program Files\Microsoft SDKs\Windows\v6.0\bin. Jeden z těchto adresářů musí být ve vaší systémové cestě. Pokud máte nainstalovanou sadu Visual Studio, nejjednodušším způsobem, jak přidat tento adresář do cesty, je otevřít Příkazový řádek pro vývojáře v sadě Visual Studio. Klikněte na Spustita potom vyberte Všechny programy, Visual Studio 2012, Nástroje. Tento příkazový řádek má již nakonfigurované odpovídající cesty. Jinak musíte do systémové cesty přidat příslušný adresář ručně.
Jak nastavit, sestavit a spustit ukázku
Ujistěte se, že jste provedli postup nastavování One-Time pro ukázky Windows Communication Foundation.
Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.
Spustit ukázku na stejném počítači
Otevřete příkazový řádek pro vývojáře pro Visual Studio s oprávněními správce a spusťte Setup.bat z ukázkové instalační složky. Tím se nainstalují všechny certifikáty potřebné pro spuštění ukázky.
Poznámka
Dávkový soubor Setup.bat je určený ke spuštění z příkazového řádku pro vývojáře pro Visual Studio. Vyžaduje, aby proměnná prostředí PATH ukazovala na adresář, ve kterém je nainstalovaná sada SDK. Tato proměnná prostředí se automaticky nastaví v rámci příkazového řádku pro vývojáře pro Visual Studio (2010).
Zadáním adresy
http://localhost/servicemodelsamples/service.svc
ověřte přístup ke službě pomocí prohlížeče.Spusťte Client.exe z \client\bin. Aktivita klienta se zobrazí v aplikaci konzoly klienta.
Pokud klient a služba nemohou komunikovat, přečtěte si tipy k řešení potíží s WCF ukázkami.
Chcete-li spustit ukázku na různých počítačích
Vytvořte adresář na počítači služby. Pomocí nástroje pro správu Internetové informační služby (IIS) vytvořte virtuální aplikaci s názvem servicemodelsamples pro tento adresář.
Zkopírujte soubory programu služby z \inetpub\wwwroot\servicemodelsamples do virtuálního adresáře v počítači služby. Ujistěte se, že kopírujete soubory v podadresáři \bin. Zkopírujte také soubory Setup.bat, Cleanup.bata ImportClientCert.bat do počítače služby.
Vytvořte adresář v klientském počítači pro binární soubory klienta.
Zkopírujte soubory klientského programu do klientského adresáře v klientském počítači. Zkopírujte také soubory Setup.bat, Cleanup.bata ImportServiceCert.bat do klienta.
Na serveru spusťte službu setup.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Spuštění setup.bat s argumentem pro službu vytvoří certifikát služby s plně kvalifikovaným názvem domény počítače a exportuje tento certifikát do souboru pojmenovaného Service.cer.
Upravte Web.config tak, aby odrážel nový název certifikátu (v atributu
findValue
v <serviceCertificate>), který je stejný jako plně kvalifikovaný název domény počítače.Zkopírujte soubor Service.cer z adresáře služby do klientského adresáře v klientském počítači.
Na klientovi spusťte setup.bat klienta v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Spuštění setup.bat s argumentem klienta vytvoří klientský certifikát s názvem client.com a exportuje klientský certifikát do souboru s názvem Client.cer.
V souboru Client.exe.config na klientském počítači změňte hodnotu adresy koncového bodu tak, aby odpovídala nové adrese vaší služby. Provedete to tak, že nahradíte localhost plně kvalifikovaným názvem domény serveru.
Zkopírujte soubor Client.cer z klientského adresáře do adresáře služby na serveru.
Na klientovi spusťte ImportServiceCert.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Tím se certifikát služby naimportuje ze souboru Service.cer do úložiště CurrentUser – TrustedPeople.
Na serveru spusťte ImportClientCert.bat v příkazovém řádku pro vývojáře pro Visual Studio s oprávněními správce. Tím se klientský certifikát naimportuje ze souboru Client.cer do úložiště LocalMachine – TrustedPeople.
Na klientském počítači spusťte Client.exe z okna příkazového řádku. Pokud klient a služba nemohou komunikovat, podívejte se na Tipy pro řešení potíží s ukázkami WCF.
Úklid po vzorku
Po dokončení spuštění ukázky spusťte Cleanup.bat ve složce s ukázkami.
Poznámka
Tento skript při spouštění této ukázky na počítačích neodebere služební certifikáty na klientovi. Pokud jste spustili ukázky wcf (Windows Communication Foundation), které používají certifikáty napříč počítači, nezapomeňte vymazat certifikáty služby nainstalované v úložišti CurrentUser – TrustedPeople. K tomu použijte následující příkaz:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Například:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.