Condividi tramite


Certificato di sicurezza dei messaggi

L'esempio di MessageSecurity illustra come implementare un'applicazione che usa WS-Security con l'autenticazione del certificato X.509 v3 per il client e richiede l'autenticazione server usando il certificato X.509 v3 del server. Questo esempio usa le impostazioni predefinite in modo che tutti i messaggi dell'applicazione tra il client e il server siano firmati e crittografati. Questo esempio si basa sul WSHttpBinding ed è costituito da un programma console client e da una libreria di servizi ospitata da Internet Information Services (IIS). Il servizio implementa un contratto che definisce un modello di comunicazione request-reply.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.

L'esempio illustra il controllo dell'autenticazione usando la configurazione e come ottenere l'identità del chiamante dal contesto di sicurezza, come illustrato nel codice di esempio seguente.

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;
    }
    ...
}

Il servizio espone un endpoint per la comunicazione con il servizio e un endpoint per esporre il documento WSDL del servizio usando il protocollo WS-MetadataExchange, definito tramite il file di configurazione (Web.config). L'endpoint è costituito da un indirizzo, un binding e un contratto. L'associazione è configurata con un elemento <standard wsHttpBinding>, che per impostazione predefinita usa la sicurezza dei messaggi. Questo esempio imposta l'attributo clientCredentialType su Certificate per richiedere l'autenticazione client.

<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>

Il comportamento specifica le credenziali del servizio usate quando il client autentica il servizio. Il nome soggetto del certificato server viene specificato nell'attributo findValue nell'elemento>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>

La configurazione dell'endpoint client è costituita da un indirizzo assoluto per l'endpoint del servizio, il binding e il contratto. L'associazione client è configurata con la modalità di sicurezza e la modalità di autenticazione appropriata. Quando si opera in uno scenario cross-computer, assicurarsi che l'indirizzo dell'endpoint del servizio sia modificato di conseguenza.

<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>

L'implementazione client può impostare il certificato da usare, tramite il file di configurazione o tramite il codice. L'esempio seguente illustra come impostare il certificato da usare nel file di configurazione.

<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>

L'esempio seguente illustra come chiamare il servizio nel programma.

// 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();

Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. Premere INVIO nella finestra del client per chiudere il client.

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.

Il Setup.bat file batch incluso negli esempi di sicurezza dei messaggi consente di configurare il client e il server con i certificati pertinenti per eseguire un'applicazione ospitata che richiede la sicurezza basata su certificati. Il file batch può essere eseguito in tre modalità. Per eseguire in modalità a computer singolo digita setup.bat in un prompt dei comandi per sviluppatori per Visual Studio. Per la modalità servizio digita setup.bat servizio. E per la modalità client digita setup.bat client. Usare la modalità client e server quando si esegue l'esempio tra i computer. Per informazioni dettagliate, vedere la procedura di installazione alla fine di questo argomento. Di seguito viene fornita una breve panoramica delle diverse sezioni dei file batch in modo che possano essere modificate per l'esecuzione nella configurazione appropriata:

  • Creazione del certificato client.

    La riga seguente nel file batch crea il certificato client. Il nome client specificato viene usato nel nome soggetto del certificato creato. Il certificato viene archiviato nell'archivio My nel percorso dell'archivio CurrentUser.

    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 attendibile del server.

    La riga seguente nel file batch copia il certificato client nell'archivio TrustedPeople del server in modo che il server possa prendere le decisioni di attendibilità o senza attendibilità pertinenti. Affinché un certificato installato nell'archivio TrustedPeople sia considerato attendibile da un servizio Windows Communication Foundation (WCF), la modalità di convalida del certificato client deve essere impostata su PeerOrChainTrust o PeerTrust. Vedere l'esempio di configurazione del servizio precedente per informazioni su come eseguire questa operazione usando un file di configurazione.

    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 del server.

    Le righe seguenti del file batch Setup.bat creano il certificato server da usare.

    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. Il certificato viene archiviato nell'archivio LocalMachine. Se il file batch Setup.bat viene eseguito con un argomento di servizio ,ad esempio setup.bat servizio) il %SERVER_NAME% contiene il nome di dominio completo del computer. In caso contrario, l'impostazione predefinita è localhost.

  • Installazione del certificato server nell'archivio certificati attendibile del client.

    La riga seguente copia il certificato del server nell'archivio persone attendibili del client. Questo passaggio è obbligatorio perché i certificati generati da Makecert.exe non sono considerati implicitamente attendibili dal sistema client. Se si dispone già di un certificato radicato in un certificato radice attendibile client, come ad esempio un certificato rilasciato da Microsoft, non è necessario eseguire questo passaggio di popolamento dell'archivio certificati client con il certificato server.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    
  • Concessione delle autorizzazioni per la chiave privata del certificato.

    Le righe seguenti nel file Setup.bat rendono il certificato server archiviato nell'archivio LocalMachine accessibile all'account del processo di lavoro 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
    

    Nota

    Se stai utilizzando un'edizione di Windows in inglese diversa da quella degli Stati Uniti, devi modificare il file Setup.bat e sostituire il nome dell'account "NT AUTHORITY\NETWORK SERVICE" con il corrispondente regionale.

Nota

Gli strumenti usati in questo file batch si trovano in C:\Programmi\Microsoft Visual Studio 8\Common7\tools o C:\Programmi\Microsoft SDKs\Windows\v6.0\bin. Una di queste directory deve trovarsi nel percorso di sistema. Se Visual Studio è installato, il modo più semplice per ottenere questa directory nel percorso consiste nell'aprire il prompt dei comandi per gli sviluppatori per Visual Studio. Fare clic su Starte quindi selezionare Tutti i programmi, Visual Studio 2012, Tools. Questo prompt dei comandi include i percorsi appropriati già configurati. In caso contrario, è necessario aggiungere manualmente la directory appropriata al tuo percorso.

Per configurare, compilare ed eseguire l'esempio

  1. Assicurarsi di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.

  2. Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.

Per eseguire l'esempio nello stesso computer

  1. Aprire un prompt dei comandi per gli sviluppatori per Visual Studio con privilegi di amministratore ed eseguire Setup.bat dalla cartella di installazione di esempio. Vengono installati tutti i certificati necessari per l'esecuzione dell'esempio.

    Nota

    Il file batch Setup.bat è progettato per essere eseguito da un prompt dei comandi per gli sviluppatori per Visual Studio. Richiede che la variabile di ambiente del percorso punti alla directory in cui è installato l'SDK. Questa variabile di ambiente viene impostata automaticamente all'interno di un prompt dei comandi per gli sviluppatori per Visual Studio (2010).

  2. Verificare l'accesso al servizio usando un browser immettendo l'indirizzo http://localhost/servicemodelsamples/service.svc.

  3. Avvia Client.exe da \client\bin. L'attività client viene visualizzata nell'applicazione console client.

  4. Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi per gli esempi WCF.

Per eseguire l'esempio tra computer

  1. Creare una directory nel computer del servizio. Creare un'applicazione virtuale denominata servicemodelsamples per questa directory usando lo strumento di gestione Internet Information Services (IIS).

  2. Copiare i file di programma del servizio da \inetpub\wwwroot\servicemodelsamples alla directory virtuale nel computer del servizio. Assicurarsi di copiare i file nella sottodirectory \bin. Copiare anche i file Setup.bat, Cleanup.bate ImportClientCert.bat nel computer del servizio.

  3. Creare una directory nel computer client per i file binari del client.

  4. Copiare i file del programma cliente nella cartella client sul computer cliente. Copiare anche i file Setup.bat, Cleanup.bate ImportServiceCert.bat nel client.

  5. Nel server eseguire setup.bat servizio in un prompt dei comandi per gli sviluppatori per Visual Studio con privilegi di amministratore. L'esecuzione di setup.bat con l'argomento del servizio crea un certificato del servizio con il nome di dominio completo del computer ed esporta il certificato del servizio in un file denominato Service.cer.

  6. Modificare Web.config in modo da riflettere il nuovo nome del certificato (nell'attributo findValue nel <serviceCertificate>) che corrisponde al nome di dominio completo del computer.

  7. Copiare il file Service.cer dalla directory del servizio alla directory client nel computer client.

  8. Nel client eseguire setup.bat client in un prompt dei comandi per gli sviluppatori per Visual Studio con privilegi di amministratore. L'esecuzione di setup.bat con l'argomento client crea un certificato client denominato client.com ed esporta il certificato client in un file denominato Client.cer.

  9. Nel file Client.exe.config, sul computer client, modificare il valore dell'indirizzo dell'endpoint affinché corrisponda al nuovo indirizzo del servizio. A tale scopo, sostituire localhost con il nome di dominio completo del server.

  10. Copiare il file Client.cer dalla directory client alla directory del servizio nel server.

  11. Nel client eseguire ImportServiceCert.bat in un prompt dei comandi per gli sviluppatori per Visual Studio con privilegi amministrativi. Questo importa il certificato del servizio dal file Service.cer nell'archivio CurrentUser - TrustedPeople.

  12. Nel server eseguire ImportClientCert.bat in un prompt dei comandi per gli sviluppatori per Visual Studio con privilegi amministrativi. Questo importa il certificato client dal file Client.cer nell'archivio LocalMachine - TrustedPeople.

  13. Nel computer client avviare Client.exe da una finestra del prompt dei comandi. Se il client e il servizio non sono in grado di comunicare, vedere Suggerimenti per la risoluzione dei problemi per esempi WCF.

Per eseguire la pulizia dopo l'esempio

  • Eseguire Cleanup.bat nella cartella samples dopo aver completato l'esecuzione dell'esempio.

    Nota

    Questo script non rimuove i certificati del servizio in un client durante l'esecuzione di questo esempio tra computer. Se hai eseguito esempi di Windows Communication Foundation (WCF) che usano certificati su diversi computer, assicurati di cancellare i certificati di servizio che sono stati installati nell'archivio CurrentUser - TrustedPeople. A tale scopo, usare il comando seguente: 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.