Berichtbeveiliging via Message Queuing
Het MessageSecurity-voorbeeld laat zien hoe u een toepassing implementeert die WS-Security gebruikt met X.509v3-certificaatverificatie voor de client en serververificatie vereist met behulp van het X.509v3-certificaat van de server via MSMQ. Berichtbeveiliging is soms wenselijker om ervoor te zorgen dat de berichten in het MSMQ-archief versleuteld blijven en dat de toepassing een eigen verificatie van het bericht kan uitvoeren.
Dit voorbeeld is gebaseerd op het transacted MSMQ Binding-voorbeeld . De berichten worden versleuteld en ondertekend.
Het voorbeeld instellen, compileren en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als de service eerst wordt uitgevoerd, wordt gecontroleerd of de wachtrij aanwezig is. Als de wachtrij niet aanwezig is, maakt de service er een. U kunt de service eerst uitvoeren om de wachtrij te maken of u kunt er een maken via MSMQ Queue Manager. Volg deze stappen om een wachtrij te maken in Windows 2008.
Open Serverbeheer in Visual Studio 2012.
Vouw het tabblad Functies uit.
Klik met de rechtermuisknop op Persoonlijke berichtenwachtrijen en selecteer Nieuwe, Privéwachtrij.
Schakel het selectievakje Transactioneel in.
Voer de
ServiceModelSamplesTransacted
naam in van de nieuwe wachtrij.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Het voorbeeld uitvoeren op dezelfde computer
Zorg ervoor dat het pad de map bevat die Makecert.exe en FindPrivateKey.exe bevat.
Voer Setup.bat uit vanuit de voorbeeldinstallatiemap. Hiermee worden alle certificaten geïnstalleerd die vereist zijn voor het uitvoeren van het voorbeeld.
Notitie
Zorg ervoor dat u de certificaten verwijdert door Cleanup.bat uit te voeren wanneer u klaar bent met het voorbeeld. Andere beveiligingsvoorbeelden gebruiken dezelfde certificaten.
Start Service.exe vanuit \service\bin.
Start Client.exe vanuit \client\bin. Clientactiviteit wordt weergegeven in de clientconsoletoepassing.
Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.
Het voorbeeld uitvoeren op computers
Kopieer de bestanden Setup.bat, Cleanup.bat en ImportClientCert.bat naar de servicecomputer.
Maak een map op de clientcomputer voor de binaire clientbestanden.
Kopieer de clientprogrammabestanden naar de clientmap op de clientcomputer. Kopieer ook de bestanden Setup.bat, Cleanup.bat en ImportServiceCert.bat naar de client.
Voer op de server de opdracht uit
setup.bat service
. Als u hetservice
argument uitvoertsetup.bat
, maakt u een servicecertificaat met de volledig gekwalificeerde domeinnaam van de computer en exporteert u het servicecertificaat naar een bestand met de naam Service.cer.Bewerk de service.exe.config van de service om de nieuwe certificaatnaam (in het
findValue
kenmerk in serviceCertificate<>) weer te geven. Dit is hetzelfde als de volledig gekwalificeerde domeinnaam van de computer.Kopieer het Service.cer-bestand van de servicemap naar de clientmap op de clientcomputer.
Voer op de client de opdracht uit
setup.bat client
. Als u het argument uitvoertsetup.bat
, maakt u een clientcertificaat met declient
naam client.com en exporteert u het clientcertificaat naar een bestand met de naam Client.cer.Wijzig in het bestand Client.exe.config op de clientcomputer de adreswaarde van het eindpunt zodat deze overeenkomt met het nieuwe adres van uw service. Doe dit door localhost te vervangen door de volledig gekwalificeerde domeinnaam van de server. U moet ook de certificaatnaam van de service wijzigen zodat deze gelijk is aan de volledig gekwalificeerde domeinnaam van de servicecomputer (in het
findValue
kenmerk in hetdefaultCertificate
element onderserviceCertificate
clientCredentials
).Kopieer het Client.cer-bestand van de clientmap naar de servicemap op de server.
Voer op de client de opdracht uit
ImportServiceCert.bat
. Hiermee importeert u het servicecertificaat uit het Service.cer-bestand in het CurrentUser - Trusted Mensen-archief.Voer
ImportClientCert.bat
op de server uit, hiermee importeert u het clientcertificaat uit het Client.cer-bestand in het LocalMachine - Trusted Mensen-archief.Start Service.exe vanaf de opdrachtprompt op de servicecomputer.
Start Client.exe vanaf de opdrachtprompt op de clientcomputer. Als de client en service niet kunnen communiceren, raadpleegt u Tips voor probleemoplossing voor WCF-voorbeelden.
Opschonen na het voorbeeld
Voer Cleanup.bat uit in de map met voorbeelden zodra u klaar bent met het uitvoeren van het voorbeeld.
Notitie
Dit script verwijdert geen servicecertificaten op een client bij het uitvoeren van dit voorbeeld op computers. Als u WCF-voorbeelden (Windows Communication Foundation) hebt uitgevoerd die gebruikmaken van certificaten op computers, moet u de servicecertificaten wissen die zijn geïnstalleerd in het CurrentUser - Trusted Mensen-archief. Gebruik hiervoor de volgende opdracht: bijvoorbeeld:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.
Vereisten
Voor dit voorbeeld is vereist dat MSMQ is geïnstalleerd en wordt uitgevoerd.
Demonstreert
De client versleutelt het bericht met behulp van de openbare sleutel van de service en ondertekent het bericht met een eigen certificaat. De service die het bericht uit de wachtrij leest, verifieert het clientcertificaat met het certificaat in het archief vertrouwde personen. Vervolgens ontsleutelt het bericht en verzendt het bericht naar de servicebewerking.
Omdat het WCF-bericht (Windows Communication Foundation) wordt meegenomen als een nettolading in de hoofdtekst van het MSMQ-bericht, blijft de hoofdtekst versleuteld in het MSMQ-archief. Hierdoor wordt het bericht beveiligd tegen ongewenste openbaarmaking van het bericht. Houd er rekening mee dat MSMQ zelf niet weet of het bericht dat het draagt, is versleuteld.
In het voorbeeld ziet u hoe wederzijdse verificatie op berichtniveau kan worden gebruikt met MSMQ. De certificaten worden buiten de band uitgewisseld. Dit is altijd het geval bij de toepassing in de wachtrij, omdat de service en de client niet tegelijkertijd actief hoeven te zijn.
Beschrijving
De voorbeeldclient- en servicecode zijn hetzelfde als het transacted MSMQ Binding-voorbeeld met één verschil. Het bewerkingscontract wordt geannoteerd met het beveiligingsniveau, wat aangeeft dat het bericht moet worden ondertekend en versleuteld.
// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, ProtectionLevel=ProtectionLevel.EncryptAndSign)]
void SubmitPurchaseOrder(PurchaseOrder po);
}
Om ervoor te zorgen dat het bericht wordt beveiligd met behulp van het vereiste token om de service en client te identificeren, bevat de App.config referentiegegevens.
De clientconfiguratie geeft het servicecertificaat op om de service te verifiëren. Het gebruikt de LocalMachine-winkel als het vertrouwde archief om te vertrouwen op de geldigheid van de service. Het geeft ook het clientcertificaat op dat is gekoppeld aan het bericht voor serviceverificatie van de client.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesMessageSecurity"
binding="netMsmqBinding"
bindingConfiguration="messageSecurityBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor"
behaviorConfiguration="ClientCertificateBehavior" />
</client>
<bindings>
<netMsmqBinding>
<binding name="messageSecurityBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</netMsmqBinding>
</bindings>
<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>
<defaultCertificate findValue="localhost" storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it is 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" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Houd er rekening mee dat de beveiligingsmodus is ingesteld op Bericht en het ClientCredentialType is ingesteld op Certificaat.
De serviceconfiguratie bevat een servicegedrag waarmee de referenties van de service worden opgegeven die worden gebruikt wanneer de client de service verifieert. De onderwerpnaam van het servercertificaat wordt opgegeven in het findValue
kenmerk in de <serviceCredentials>.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!-- Use appSetting to configure MSMQ queue name. -->
<add key="queueName" value=".\private$\ServiceModelSamplesMessageSecurity" />
</appSettings>
<system.serviceModel>
<services>
<service
name="Microsoft.ServiceModel.Samples.OrderProcessorService"
behaviorConfiguration="PurchaseOrderServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
</baseAddresses>
</host>
<!-- Define NetMsmqEndpoint -->
<endpoint address="net.msmq://localhost/private/ServiceModelSamplesMessageSecurity"
binding="netMsmqBinding"
bindingConfiguration="messageSecurityBinding"
contract="Microsoft.ServiceModel.Samples.IOrderProcessor" />
<!-- The mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex. -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<netMsmqBinding>
<binding name="messageSecurityBinding">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</netMsmqBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="PurchaseOrderServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
<!--
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>
<certificate findValue="client.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName"/>
<!--
Setting the certificateValidationMode to PeerOrChainTrust means that if the certificate
is in the user's Trusted People store, then it is 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>
</configuration>
In het voorbeeld ziet u hoe u verificatie beheert met behulp van configuratie en hoe u de identiteit van de beller ophaalt uit de beveiligingscontext, zoals wordt weergegeven in de volgende voorbeeldcode:
// Service class which implements the service contract.
// Added code to write output to the console window.
public class OrderProcessorService : IOrderProcessor
{
private 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;
}
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(PurchaseOrder po)
{
Console.WriteLine("Client's Identity {0} ", GetCallerIdentity());
Orders.Add(po);
Console.WriteLine("Processing {0} ", po);
}
//…
}
Wanneer de servicecode wordt uitgevoerd, wordt de clientidentificatie weergegeven. Hier volgt een voorbeelduitvoer van de servicecode:
The service is ready.
Press <ENTER> to terminate service.
Client's Identity CN=client.com; ECA6629A3C695D01832D77EEE836E04891DE9D3C
Processing Purchase Order: 6536e097-da96-4773-9da3-77bab4345b5d
Customer: somecustomer.com
OrderDetails
Order LineItem: 54 of Blue Widget @unit price: $29.99
Order LineItem: 890 of Red Widget @unit price: $45.89
Total cost of this order: $42461.56
Order status: Pending
Opmerkingen
Het clientcertificaat maken.
Met de volgende regel in het batchbestand wordt het clientcertificaat gemaakt. De opgegeven clientnaam wordt gebruikt in de onderwerpnaam van het certificaat dat is gemaakt. Het certificaat wordt opgeslagen in
My
het archief op deCurrentUser
opslaglocatie.echo ************ echo making client cert echo ************ makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
Het clientcertificaat installeren in het vertrouwde certificaatarchief van de server.
Met de volgende regel in het batchbestand wordt het clientcertificaat gekopieerd naar het vertrouwde archief van de server Mensen zodat de server de relevante vertrouwens- of no-trust-beslissingen kan nemen. Voor een certificaat dat is geïnstalleerd in het vertrouwde Mensen archief dat wordt vertrouwd door een WCF-service (Windows Communication Foundation), moet de validatiemodus voor clientcertificaten worden ingesteld
PeerOrChainTrust
op ofPeerTrust
de waarde. Zie het vorige voorbeeld van de serviceconfiguratie voor meer informatie over hoe u dit kunt doen met behulp van een configuratiebestand.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
Het servercertificaat maken.
Met de volgende regels van het Setup.bat batchbestand maakt u het servercertificaat dat moet worden gebruikt:
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
De variabele %SERVER_NAME% geeft de servernaam op. Het certificaat wordt opgeslagen in het LocalMachine-archief. Als het installatiebatchbestand wordt uitgevoerd met een argument van de service (zoals)
setup.bat service
bevat de %SERVER_NAME% de volledig gekwalificeerde domeinnaam van de computer. Anders wordt standaard localhost gebruiktServercertificaat installeren in het vertrouwde certificaatarchief van de client.
Met de volgende regel wordt het servercertificaat gekopieerd naar het archief vertrouwde personen van de client. Deze stap is vereist omdat certificaten die worden gegenereerd door Makecert.exe niet impliciet worden vertrouwd door het clientsysteem. Als u al een certificaat hebt dat is geroot in een vertrouwd basiscertificaat van een client, bijvoorbeeld een door Microsoft uitgegeven certificaat, is deze stap voor het invullen van het clientcertificaatarchief met het servercertificaat niet vereist.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Notitie
Als u een niet-Amerikaanse gebruiker gebruikt In de Engelse versie van Microsoft Windows moet u het Setup.bat-bestand bewerken en de accountnaam NT AUTHORITY\NETWORK SERVICE vervangen door uw regionale equivalent.