Sicurezza dei messaggi nell'accodamento messaggiMessage Security over Message Queuing

In questo esempio viene illustrato come implementare un'applicazione che utilizza WS-Security con l'autenticazione del certificato X.509v3 per il client e che richiede l'autenticazione del server utilizzando il certificato X.509v3 del server su MSMQ.This sample demonstrates how to implement an application that uses WS-Security with X.509v3 certificate authentication for the client and requires server authentication using the server's X.509v3 certificate over MSMQ. La sicurezza dei messaggi a volte è più efficace per garantire che i messaggi nell'archivio MSMQ siano crittografati e l'applicazione può eseguire direttamente l'autenticazione del messaggio.Message security is sometimes more desirable to ensure that the messages in the MSMQ store stay encrypted and the application can perform its own authentication of the message.

Questo esempio è basato sul transazionale associazione MSMQ esempio.This sample is based on the Transacted MSMQ Binding sample. I messaggi vengono crittografati e firmati.The messages are encrypted and signed.

Per impostare, compilare ed eseguire l'esempioTo set up, build, and run the sample

  1. Assicurarsi di avere eseguito la procedura di installazione singola per gli esempi di Windows Communication Foundation.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Se il servizio viene eseguito prima, verificherà la presenza della coda.If the service is run first, it will check to ensure that the queue is present. Se la coda non è presente, il servizio ne creerà una.If the queue is not present, the service will create one. È possibile eseguire il servizio prima per creare la coda oppure è possibile crearne una tramite il gestore code MSMQ.You can run the service first to create the queue, or you can create one via the MSMQ Queue Manager. Per creare una coda in Windows 2008, eseguire i passaggi riportati di seguito.Follow these steps to create a queue in Windows 2008.

    1. Aprire Server Manager in Visual Studio 2012Visual Studio 2012.Open Server Manager in Visual Studio 2012Visual Studio 2012.

    2. Espandere il funzionalità scheda.Expand the Features tab.

    3. Fare doppio clic su code Privatee selezionare New, coda privata.Right-click Private Message Queues, and select New, Private Queue.

    4. Controllare il transazionale casella.Check the Transactional box.

    5. Immettere ServiceModelSamplesTransacted come il nome della nuova coda.Enter ServiceModelSamplesTransacted as the name of the new queue.

  3. Per compilare l'edizione in C# o Visual Basic .NET della soluzione, seguire le istruzioni in Building the Windows Communication Foundation Samples.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

Per eseguire l'esempio nello stesso computerTo run the sample on the same computer

  1. Assicurarsi che il percorso includa la cartella contenente Makecert.exe e FindPrivateKey.exe.Ensure that the path includes the folder that contains Makecert.exe and FindPrivateKey.exe.

  2. Eseguire Setup.bat dalla cartella di installazione dell'esempio.Run Setup.bat from the sample install folder. In questo modo vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.This installs all the certificates required for running the sample.

    Nota

    Assicurarsi di rimuovere i certificati eseguendo Cleanup.bat una volta completato l'esempio.Ensure that you remove the certificates by running Cleanup.bat when you have finished with the sample. Negli altri esempi relativi alla sicurezza vengono usati gli stessi certificati.Other security samples use the same certificates.

  3. Avviare Service.exe da \service\bin.Launch Service.exe from \service\bin.

  4. Avviare Client.exe da \client\bin.Launch Client.exe from \client\bin. L'attività del client viene visualizzata nella finestra dell'applicazione console.Client activity is displayed on the client console application.

  5. Se il client e il servizio non sono in grado di comunicare, vedere suggerimenti per la risoluzione dei problemi.If the client and service are not able to communicate, see Troubleshooting Tips.

Per eseguire l'esempio tra più computerTo run the sample across computers

  1. Copiare i file Setup.bat, Cleanup.bat e ImportClientCert.bat nel computer del servizio.Copy the Setup.bat, Cleanup.bat, and ImportClientCert.bat files to the service computer.

  2. Creare una directory sul client del servizio per i file binari del client.Create a directory on the client computer for the client binaries.

  3. Copiare i file di programma del client nella directory del client sul computer relativoCopy the client program files to the client directory on the client computer. e i file Setup.bat, Cleanup.bat e ImportServiceCert.bat nel client.Also copy the Setup.bat, Cleanup.bat, and ImportServiceCert.bat files to the client.

  4. Eseguire setup.bat service sul server.On the server, run setup.bat service. Esecuzione setup.bat con il service argomento crea un certificato di servizio con il nome di dominio completo del computer e il certificato di servizio viene esportato in un file denominato Service.cer.Running setup.bat with the service argument creates a service certificate with the fully-qualified domain name of the computer and exports the service certificate to a file named Service.cer.

  5. Modifica Service.exe del servizio in modo da riflettere il nuovo nome del certificato (nel findValue attributo la <serviceCertificate >) che corrisponde al nome di dominio completo del computer.Edit service's service.exe.config to reflect the new certificate name (in the findValue attribute in the <serviceCertificate>) which is the same as the fully-qualified domain name of the computer.

  6. Copiare il file Service.cer dalla directory del servizio nella directory del client sul computer relativo.Copy the Service.cer file from the service directory to the client directory on the client computer.

  7. Eseguire setup.bat client sul client.On the client, run setup.bat client. Quando si esegue setup.bat con l'argomento client viene creato un certificato client denominato client.com che viene esportato in un file denominato Client.cer.Running setup.bat with the client argument creates a client certificate named client.com and exports the client certificate to a file named Client.cer.

  8. Nel file Client.exe.config presente nel computer client modificare il valore dell'indirizzo della definizione dell'endpoint in base al nuovo indirizzo del servizio.In the Client.exe.config file on the client computer, change the address value of the endpoint to match the new address of your service. Tale operazione viene eseguita sostituendo localhost con il nome di dominio completo del server.Do this by replacing localhost with the fully-qualified domain name of the server. È inoltre necessario modificare il nome di certificato del servizio in modo che corrisponda al nome di dominio completo del computer del servizio (nell'attributo findValue dell'elemento defaultCertificate di serviceCertificate in clientCredentials).You must also change the certificate name of the service to be the same as the fully-qualified domain name of the service computer (in the findValue attribute in the defaultCertificate element of serviceCertificate under clientCredentials).

  9. Copiare il file Client.cer dalla directory del client nella directory del servizio sul server.Copy the Client.cer file from the client directory to the service directory on the server.

  10. Eseguire ImportServiceCert.bat sul client.On the client, run ImportServiceCert.bat. In questo modo viene importato il certificato del servizio dal file Service.cer nell'archivio CurrentUser - TrustedPeople.This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store.

  11. Eseguire ImportClientCert.bat sul server. In questo modo il certificato client viene importato dal file Client.cer nell'archivio LocalMachine - TrustedPeople.On the server, run ImportClientCert.bat, This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store.

  12. Sul computer del servizio eseguire Service.exe dal prompt dei comandi.On the service computer, launch Service.exe from the command prompt.

  13. Sul computer client avviare Client.exe dal prompt dei comandi.On the client computer, launch Client.exe from the command prompt. Se il client e il servizio non sono in grado di comunicare, vedere suggerimenti per la risoluzione dei problemi.If the client and service are not able to communicate, see Troubleshooting Tips.

Per eseguire la pulizia dopo l'esempioTo clean up after the sample

  • Eseguire Cleanup.bat nella cartella degli esempi una volta completato l'esempio.Run Cleanup.bat in the samples folder once you have finished running the sample.

    Nota

    Questo script non rimuove i certificati del servizio da un client quando si esegue l'esempio tra più computer.This script does not remove service certificates on a client when running this sample across computers. Se sono stati eseguiti esempi di Windows Communication Foundation (WCF) che usano certificati tra più computer, assicurarsi di cancellare i certificati del servizio che sono stati installati nell'archivio CurrentUser - TrustedPeople.If you have run Windows Communication Foundation (WCF) samples that use certificates across computers, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. Per eseguire questa operazione, usare il seguente comando: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> Ad esempio: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.To do this, use the following command: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name> For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.

RequisitiRequirements

Questo esempio richiede che MSMQ sia installato e in esecuzione,This sample requires that MSMQ is installed and running.

DimostrazioneDemonstrates

Il client crittografa il messaggio con la chiave pubblica del servizio e firma il messaggio utilizzando il relativo certificato.The client encrypts the message using the public key of the service and signs the message using its own certificate. Il servizio che legge il messaggio dalla coda autentica il certificato client con il certificato nell'archivio Persone attendibili.The service reading the message from the queue authenticates the client certificate with the certificate in its trusted people store. Successivamente decrittografa il messaggio e lo invia all'operazione del servizio.It then decrypts the message and dispatches the message to the service operation.

Poiché il messaggio di Windows Communication Foundation (WCF) viene trasportato come payload nel corpo del messaggio MSMQ, il corpo resta crittografato nell'archivio MSMQ.Because the Windows Communication Foundation (WCF) message is carried as a payload in the body of the MSMQ message, the body remains encrypted in the MSMQ store. In questo modo il messaggio viene protetto dalla diffusione indesiderata.This secures the message from unwanted disclosure of the message. Si noti che il servizio MSMQ non è in grado di identificare se il messaggio trasportato è crittografato.Note that MSMQ itself is not aware whether the message it is carrying is encrypted.

Nell'esempio viene illustrato come l'autenticazione reciproca al livello del messaggio può essere utilizzata con MSMQ.The sample demonstrates how mutual authentication at the message level can be used with MSMQ. I certificati vengono scambiati fuori banda.The certificates are exchanged out-of-band. Questo comportamento viene applicato sempre nel caso delle applicazioni accodate poiché non è necessario che il client e il servizio siano in esecuzione contemporaneamente.This is always the case with queued application because the service and the client do not have to be up and running at the same time.

DescrizioneDescription

Il codice di esempio client e il servizio sono gli stessi di transazionale associazione MSMQ esempio con una differenza.The sample client and service code are the same as the Transacted MSMQ Binding sample with one difference. Il contratto dell'operazione è annotato con il livello di protezione che suggerisce che il messaggio deve essere firmato e crittografato.The operation contract is annotated with protection level, which suggests that the message must be signed and encrypted.

// Define a service contract.   
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]  
public interface IOrderProcessor  
{  
    [OperationContract(IsOneWay = true, ProtectionLevel=ProtectionLevel.EncryptAndSign)]  
    void SubmitPurchaseOrder(PurchaseOrder po);  
}  

Per assicurare che il messaggio venga protetto utilizzando il token necessario per identificare il servizio e client, il file App.config contiene informazioni sulle credenziali.To ensure that the message is secured using the required token to identify the service and client, the App.config contains credential information.

La configurazione client specifica il certificato del servizio per autenticare il servizio.The client configuration specifies the service certificate to authenticate the service. Tale configurazione utilizza l'archivio del computer locale come archivio attendibile per basarsi sulla validità del servizio.It uses its LocalMachine store as the trusted store to rely on the validity of the service. Specifica anche il certificato client allegato al messaggio per l'autenticazione del servizio del client.It also specifies the client certificate that is attached with the message for service authentication of the 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>  

Si noti che la modalità di sicurezza è impostata su Message e ClientCredentialType è impostato su Certificate.Note that the security mode is set to Message and the ClientCredentialType is set to Certificate.

La configurazione del servizio include un comportamento del servizio che specifica le credenziali del servizio che vengono utilizzate quando il client autentica il servizio.The service configuration includes a service behavior that specifies the service's credentials that are used when the client authenticates the service. Il nome soggetto del certificato server è specificato nel findValue attributo la <serviceCredentials >.The server certificate subject name is specified in the findValue attribute in the <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>  

Nell'esempio viene illustrato il controllo dell'autenticazione mediante la configurazione e come ottenere l'identità del chiamante dal contesto di sicurezza, come illustrato nel codice di esempio seguente:The sample demonstrates controlling authentication using configuration, and how to obtain the caller’s identity from the security context, as shown in the following sample code:

// 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);  
    }  
  //…  
}  

Quando viene eseguito, il codice del servizio visualizza l'identificazione client.When run, the service code displays the client identification. Di seguito è riportato l'output di esempio del codice del servizio:The following is a sample output from the service code:

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  

CommentiComments

  • Creazione del certificato del client.Creating the client certificate.

    La riga seguente nel file batch crea il certificato client.The following line in the batch file creates the client certificate. Il nome client specificato viene utilizzato nel nome del soggetto del certificato creato.The client name specified is used in the subject name of the certificate created. Il certificato viene inserito nell'archivio My nel percorso CurrentUser.The certificate is stored in My store at the CurrentUser store location.

    echo ************  
    echo making client cert  
    echo ************  
    makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe  
    
  • Installazione del certificato client nell'archivio certificati attendibili del server.Installing the client certificate into server’s trusted certificate store.

    La riga seguente nel file batch copia il certificato client nell'archivio TrustedPeople del server in modo che il server possa prendere le decisioni pertinenti in tema di attendibilità.The following line in the batch file copies the client certificate into the server's TrustedPeople store so that the server can make the relevant trust or no-trust decisions. Per un certificato installato nell'archivio TrustedPeople sia considerato attendibile da un servizio Windows Communication Foundation (WCF), è necessario impostare la modalità di convalida del certificato client PeerOrChainTrust o PeerTrust valore.For a certificate installed in the TrustedPeople store to be trusted by a Windows Communication Foundation (WCF) service, the client certificate validation mode must be set to PeerOrChainTrust or PeerTrust value. Per informazioni sull'esecuzione di questa operazione mediante un file di configurazione, vedere l'esempio di configurazione del servizio precedente.See the previous service configuration sample to learn how this can be done using a configuration file.

    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  
    
  • Creazione del certificato server.Creating the server certificate.

    Le righe seguenti del file batch Setup.bat creano il certificato server da utilizzare:The following lines from the Setup.bat batch file create the server certificate to be used:

    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  
    

    La variabile %SERVER_NAME% specifica il nome del server.The %SERVER_NAME% variable specifies the server name. Il certificato viene archiviato nell'archivio LocalMachine.The certificate is stored in the LocalMachine store. Se il file batch di installazione viene eseguito con un argomento di servizio (ad esempio, setup.bat service) il % nome_server % contiene il nome di dominio completo del computer. In caso contrario l'impostazione predefinita localhostIf the setup batch file is run with an argument of service (such as, setup.bat service) the %SERVER_NAME% contains the fully-qualified domain name of the computer.Otherwise it defaults to localhost

  • Installazione del certificato server nell'archivio certificati attendibili del clientInstalling server certificate into the client’s trusted certificate store.

    La riga seguente copia il certificato server nell'archivio Persone attendibili del client.The following line copies the server certificate into the client trusted people store. Questo passaggio è necessario perché certificati generati da Makecert.exe non sono considerati implicitamente attendibili dal sistema client.This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. Se è già disponibile un certificato impostato come radice in un certificato radice client attendibile, ad esempio un certificato rilasciato da Microsoft, il popolamento dell'archivio certificati client con il certificato server non è necessario.If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft-issued certificate—this step of populating the client certificate store with the server certificate is not required.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople  
    

    Nota

    Se si usa una versione in lingua diversa dall'inglese (Stati Uniti) in inglese di Microsoft Windows è necessario modificare il file Setup.bat e sostituire il nome dell'account "NT AUTHORITY\NETWORK SERVICE" con l'equivalente locale.If you are using a non-U.S. English edition of Microsoft Windows you must edit the Setup.bat file and replace the "NT AUTHORITY\NETWORK SERVICE" account name with your regional equivalent.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your computer. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Binding\Net\MSMQ\MessageSecurity

Vedere ancheSee Also