Meddelandesäkerhetscertifikat
MessageSecurity-exempel visar hur du implementerar ett program som använder WS-Security med X.509 v3-certifikatautentisering för klienten och kräver serverautentisering med hjälp av serverns X.509 v3-certifikat. I det här exemplet används standardinställningar så att alla programmeddelanden mellan klienten och servern signeras och krypteras. Det här exemplet baseras på WSHttpBinding- och består av ett klientkonsolprogram och ett tjänstbibliotek som hanteras av Internet Information Services (IIS). Tjänsten implementerar ett kontrakt som definierar ett kommunikationsmönster för begäran-svar.
Not
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Exemplet visar hur du styr autentiseringen med hjälp av konfigurationen och hur du hämtar anroparens identitet från säkerhetskontexten, enligt följande exempelkod.
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;
}
...
}
Tjänsten exponerar en slutpunkt för kommunikation med tjänsten och en slutpunkt för att exponera tjänstens WSDL-dokument med hjälp av WS-MetadataExchange-protokollet, som definieras med hjälp av konfigurationsfilen (Web.config). Slutpunkten består av en adress, en bindning och ett kontrakt. Bindningen konfigureras med ett standard-<wsHttpBinding->-element, som som standard använder meddelandesäkerhet. Det här exemplet anger attributet clientCredentialType
till Certifikat för att kräva klientautentisering.
<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>
Beteendet anger tjänstens autentiseringsuppgifter som används när klienten autentiserar tjänsten. Certifikatets ämnesnamn för servern anges i attributet findValue
i <serviceCredentials>-elementet.
<!--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>
Klientslutpunktskonfigurationen består av en absolut adress för tjänstslutpunkten, bindningen och kontraktet. Klientbindningen konfigureras med lämpligt säkerhetsläge och autentiseringsläge. När du kör i ett scenario mellan datorer kontrollerar du att tjänstslutpunktsadressen ändras i enlighet med detta.
<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>
Klientimplementeringen kan ange att certifikatet ska användas, antingen via konfigurationsfilen eller via kod. Följande exempel visar hur du ställer in certifikatet som ska användas i konfigurationsfilen.
<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>
Följande exempel visar hur du anropar tjänsten i ditt program.
// 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();
När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Tryck på RETUR i klientfönstret för att stänga av klienten.
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.
Med Setup.bat batchfil som ingår i meddelandesäkerhetsexemplen kan du konfigurera klienten och servern med relevanta certifikat för att köra ett värdbaserat program som kräver certifikatbaserad säkerhet. Batchfilen kan köras i tre lägen. Om du vill köra i endatorsläge, skriv setup.bat i en utvecklarkommandotolk för Visual Studio; för tjänstläge, skriv setup.bat tjänst; och för klientläge, skriv setup.bat klient. Använd klient- och serverläget när du kör exemplet på datorer. Mer information finns i installationsproceduren i slutet av det här avsnittet. Följande ger en kort översikt över de olika avsnitten i batchfilerna så att de kan ändras så att de körs i lämplig konfiguration:
Skapa klientcertifikatet.
Följande rad i batchfilen skapar klientcertifikatet. Det angivna klientnamnet används i certifikatets ämnesnamn som skapats. Certifikatet lagras i
My
arkiv påCurrentUser
lagringsplats.echo ************ echo making client cert echo ************ makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
Installera klientcertifikatet i serverns betrodda certifikatarkiv.
Följande rad i batchfilen kopierar klientcertifikatet till serverns TrustedPeople-arkiv så att servern kan fatta relevanta förtroende- eller förtroendebeslut. För att ett certifikat som installeras i TrustedPeople-arkivet ska vara betrott av en WCF-tjänst (Windows Communication Foundation) måste valideringsläget för klientcertifikatet vara inställt på
PeerOrChainTrust
ellerPeerTrust
. Se det tidigare tjänstkonfigurationsexemplet för att lära dig hur detta kan göras med hjälp av en konfigurationsfil.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
Skapa servercertifikatet.
Följande rader från Setup.bat batchfil skapar det servercertifikat som ska användas.
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
Variabeln %SERVER_NAME% anger servernamnet. Certifikatet lagras i LocalMachine-arkivet. Om Setup.bat batchfilen körs med ett tjänstargument (till exempel setup.bat tjänst) innehåller %SERVER_NAME% datorns fullständigt kvalificerade domännamn. Annars faller den tillbaka på localhost.
Installera servercertifikatet i klientens betrodda certifikatarkiv.
Följande rad kopierar servercertifikatet till lagret för betrodda personer hos klienten. Det här steget krävs eftersom certifikat som genereras av Makecert.exe inte är implicit betrodda av klientsystemet. Om du redan har ett certifikat som är rotat i ett klientbetrott rotcertifikat, till exempel ett Microsoft-utfärdat certifikat, krävs inte det här steget för att fylla i klientcertifikatarkivet med servercertifikatet.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Bevilja behörigheter för certifikatets privata nyckel.
Följande rader i filen Setup.bat gör servercertifikatet som lagras i LocalMachine-arkivet tillgängligt för ASP.NET arbetsprocesskontot.
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
Not
Om du använder en icke-amerikansk engelskspråkig version av Windows måste du redigera Setup.bat-filen och ersätta kontot "NT AUTHORITY\NETWORK SERVICE" med din regionala motsvarighet.
Not
Verktygen som används i den här batchfilen finns i C:\Program Files\Microsoft Visual Studio 8\Common7\tools eller C:\Program Files\Microsoft SDKs\Windows\v6.0\bin. En av dessa kataloger måste finnas i din systemsökväg. Om du har Visual Studio installerat är det enklaste sättet att lägga till den här katalogen i din sökväg att öppna Kommandotolken för utvecklare för Visual Studio. Klicka på Startaoch välj sedan Alla program, Visual Studio 2012, Tools. Den här kommandotolken har rätt sökvägar som redan har konfigurerats. Annars behöver du manuellt lägga till rätt katalog till din sökväg.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört One-Time installationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Så här kör du exemplet på samma dator
Öppna en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet och kör Setup.bat från exempelinstallationsmappen. Detta installerar alla certifikat som krävs för att köra exemplet.
Not
Setup.bat-batchfilen är utformad för att köras från en utvecklarkommandotolk för Visual Studio. Det kräver att variabeln sökvägsmiljö pekar på katalogen där SDK:et är installerat. Den här miljövariabeln anges automatiskt i en kommandotolk för utvecklare för Visual Studio (2010).
Kontrollera åtkomsten till tjänsten med hjälp av en webbläsare genom att ange adressen
http://localhost/servicemodelsamples/service.svc
.Starta Client.exe från \client\bin. Klientaktiviteten visas i klientkonsolprogrammet.
Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Så här kör du exemplet mellan datorer
Skapa en katalog på tjänstdatorn. Skapa ett virtuellt program med namnet servicemodelsamples för den här katalogen med hjälp av IIS-hanteringsverktyget (Internet Information Services).
Kopiera tjänstprogramfilerna från \inetpub\wwwroot\servicemodelsamples till den virtuella katalogen på tjänstdatorn. Se till att du kopierar filerna i underkatalogen \bin. Kopiera även Setup.bat, Cleanup.batoch ImportClientCert.bat filer till tjänstdatorn.
Skapa en katalog på klientdatorn för klient binärfilerna.
Kopiera klientprogramfilerna till klientkatalogen på klientdatorn. Kopiera även Setup.bat, Cleanup.batoch ImportServiceCert.bat filer till klienten.
På servern kör du setup.bat-tjänsten i en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet. När du kör setup.bat med argumentet tjänst skapas ett tjänstcertifikat med datorns fullständigt kvalificerade domännamn och tjänstcertifikatet exporteras till en fil med namnet Service.cer.
Redigera Web.config för att återspegla det nya certifikatnamnet (i attributet
findValue
i <serviceCertificate>) som är samma som datorns fullständigt kvalificerade domännamn.Kopiera Service.cer-filen från tjänstkatalogen till klientkatalogen på klientdatorn.
På klienten kör du setup.bat klient i en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet. När du kör setup.bat med argumentet klient skapas ett klientcertifikat med namnet client.com och klientcertifikatet exporteras till en fil med namnet Client.cer.
I den Client.exe.config filen på klientdatorn ändrar du slutpunktens adressvärde så att det matchar den nya adressen för din tjänst. Gör detta genom att ersätta localhost med serverns fullständigt kvalificerade domännamn.
Kopiera Client.cer-filen från klientkatalogen till tjänstkatalogen på servern.
På klienten kör du ImportServiceCert.bat i en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet. Detta importerar tjänstcertifikatet från filen Service.cer till lagringsplatsen CurrentUser – TrustedPeople.
På servern kör du ImportClientCert.bat i en kommandotolk för utvecklare för Visual Studio med administratörsbehörighet. Detta importerar klientcertifikatet från filen Client.cer till butiken LocalMachine – TrustedPeople.
Starta Client.exe från kommandotolken på klientdatorn. Om klienten och tjänsten inte kan kommunicera kan du läsa Felsökningstips för WCF-exempel.
Städa efter provet
Kör Cleanup.bat i exempelmappen när du har kört exemplet.
Notera
Det här skriptet tar inte bort tjänstcertifikat på en klient när du kör det här exemplet på flera datorer. Om du har kört WCF-exempel (Windows Communication Foundation) som använder certifikat mellan datorer, se till att rensa de tjänstcertifikat som har installerats i CurrentUser - TrustedPeople-arkivet. Det gör du genom att använda följande kommando:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Till exempel:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.