Certificado de mensagem de segurança
A amostra de MessageSecurity demonstra como implementar um aplicativo que usa o WS-Security com autenticação de certificado X.509 v3 para o cliente e exige a autenticação de servidor usando o certificado X.509 v3 do servidor. Esta amostra usa configurações padrão para que todas as mensagens de aplicativo entre o cliente e o servidor sejam assinadas e criptografadas. Esta amostra é baseada no WSHttpBinding e consiste em um programa de console do cliente e uma biblioteca de serviços hospedada pelos Serviços de Informações da Internet (IIS). O serviço implementa um contrato que define um padrão de comunicação solicitação-resposta.
Observação
O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.
A amostra demonstra como controlar a autenticação usando a configuração e como obter a identidade do chamador do contexto de segurança, conforme mostrado no seguinte código de exemplo.
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;
}
...
}
O serviço expõe um ponto de extremidade para se comunicar com o serviço e um ponto de extremidade para expor o documento WSDL do serviço usando o protocolo WS-MetadataExchange, definido usando o arquivo de configuração (Web.config). O ponto de extremidade é composto por um endereço, uma associação e um contrato. A associação é configurada com um elemento <wsHttpBinding> padrão, que usa como padrão a segurança da mensagem. Esta amostra define o atributo clientCredentialType
como Certificado para exigir a autenticação do cliente.
<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>
O comportamento especifica as credenciais do serviço que são usadas quando o cliente autentica o serviço. O nome da entidade de certificado do servidor é especificado no atributo findValue
no 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>
A configuração do ponto de extremidade do cliente consiste em um endereço absoluto para o ponto de extremidade de serviço, a associação e o contrato. A associação do cliente é configurada com o modo de segurança e o modo de autenticação apropriados. Ao ser executado em um cenário entre computadores, certifique-se de que o endereço do ponto de extremidade de serviço deve ser alterado de acordo.
<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>
A implementação do cliente pode definir o certificado a ser usado, seja por meio do arquivo de configuração ou por meio do código. A amostra a seguir mostra como definir o certificado a ser usado no arquivo de configuração.
<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>
A amostra a seguir mostra como chamar o serviço no seu programa.
// 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 você executa a amostra, as solicitações de operação e as respostas são exibidas na janela do console do cliente. Pressione ENTER na janela do cliente para desligar o cliente.
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.
O arquivo em lote Setup.bat incluído com as amostras de Segurança de Mensagem permite configurar o cliente e o servidor com certificados relevantes para executar um aplicativo hospedado que requer segurança baseada em certificado. O arquivo em lote pode ser executado em três modos. Para executar no tipo setup.bat de modo de computador único em um Prompt de Comando do Desenvolvedor para Visual Studio; para o tipo de serviço do setup.bat de modo de serviço; e para o tipo de cliente do setup.bat de modo cliente. Use o modo cliente e servidor ao executar a amostra em computadores. Consulte o procedimento de instalação no final deste tópico para obter detalhes. A seguir, oferecemos uma visão geral das diferentes seções dos arquivos em lote que podem ser modificadas para executar a configuração apropriada:
Criação do certificado do cliente.
A linha a seguir no arquivo em lote cria o certificado do cliente. O nome do cliente especificado é usado no nome da entidade do certificado criado. O certificado é armazenado no repositório
My
no local do repositórioCurrentUser
.echo ************ echo making client cert echo ************ makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe
Instalação do certificado do cliente no repositório de certificados confiáveis do servidor.
A linha a seguir do arquivo em lote copia o certificado do cliente no repositório TrustedPeople do servidor para que o servidor possa tomar as decisões relevantes de relação de confiança ou sem relação de confiança. Para que um certificado instalado no repositório TrustedPeople seja confiável para um serviço WCF (Windows Communication Foundation), o modo de validação de certificado do cliente precisa ser definido como
PeerOrChainTrust
ouPeerTrust
. Confira a amostra de configuração de serviço anterior para saber como isso pode ser feito usando um arquivo de configuração.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
Criação do certificado do servidor.
As linhas a seguir do arquivo em lote Setup.bat criam o certificado do servidor a ser usado.
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
A variável %SERVER_NAME% especifica o nome do servidor. O certificado é armazenado no repositório LocalMachine. Se o arquivo em lote Setup.bat for executado com um argumento de serviço (como, serviço de setup.bat), o %SERVER_NAME% contém o nome de domínio totalmente qualificado do computador. Caso contrário, ele usará localhost como padrão.
Instalação do certificado do servidor no repositório de certificados confiáveis do cliente.
A linha a seguir copia o certificado do servidor para o repositório de pessoas confiáveis do cliente. Essa etapa é necessária porque os certificados gerados por Makecert.exe não são implicitamente confiáveis pelo sistema do cliente. Se você já tiver um certificado com raiz em um certificado raiz confiável do cliente, por exemplo, um certificado emitido pela Microsoft, essa etapa de preenchimento do repositório de certificados do cliente com o certificado do servidor não será necessária.
certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
Concedendo permissões na chave privada do certificado.
As linhas a seguir no arquivo Setup.bat tornam o certificado do servidor armazenado no repositório LocalMachine acessível para a conta de processo de trabalho do 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
Observação
Se você estiver usando uma edição do Windows em inglês que não seja dos EUA, edite o arquivo Setup.bat e substitua o nome da conta "NT AUTHORITY\NETWORK SERVICE" pelo equivalente regional.
Observação
As ferramentas usadas neste arquivo em lote estão localizadas em C:\Program Files\Microsoft Visual Studio 8\Common7\tools ou C:\Program Files\Microsoft SDKs\Windows\v6.0\bin. Um desses diretórios deve estar no caminho do sistema. Se você tiver o Visual Studio instalado, a maneira mais fácil de obter esse diretório em seu caminho é abrir o Prompt de Comando do Desenvolvedor para Visual Studio. Clique em Iniciar e selecione Todos os Programas, Visual Studio 2012, Ferramentas. Esse prompt de comando tem os caminhos apropriados já configurados. Caso contrário, você deve adicionar o diretório apropriado ao seu caminho manualmente.
Para configurar, compilar, e executar o exemplo
Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.
Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.
Para executar a amostra no mesmo computador
Abra um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios de administrador e execute Setup.bat na pasta de instalação da amostra. Isso instalará todos os certificados necessários para executar o exemplo.
Observação
O arquivo em lote Setup.bat foi projetado para ser executado em um Prompt de Comando do Desenvolvedor para Visual Studio. Ele requer que a variável de ambiente de caminho aponte para o diretório onde o SDK está instalado. Essa variável de ambiente é definida automaticamente em um Prompt de Comando do Desenvolvedor para Visual Studio (2010).
Verifique o acesso ao serviço usando um navegador inserindo o endereço
http://localhost/servicemodelsamples/service.svc
.Inicialize o Client.exe a partir de \client\bin. A atividade do cliente é exibida no aplicativo do console do cliente.
Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para exemplos de WCF.
Para executar a amostra em vários computadores
Criar um diretório no computador de serviço. Crie um aplicativo virtual chamado servicemodelsamples para esse diretório usando a ferramenta de gerenciamento dos Serviços de Informações da Internet (IIS).
Copie os arquivos do programa de serviço de \inetpub\wwwroot\servicemodelsamples para o diretório virtual no computador de serviço. Certifique-se de copiar os arquivos no subdiretório \bin. Copie também os arquivos Setup.bat, Cleanup.bat e ImportClientCert.bat para o computador de serviço.
Crie um diretório no computador cliente para os binários do cliente.
Copie os arquivos do programa do cliente para o diretório do cliente no computador cliente. Copie também os arquivos Setup.bat, Cleanup.bat e ImportServiceCert.bat para o cliente.
No servidor, execute o serviço do setup.bat em um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios de administrador. A execução de setup.bat com o argumento de serviço cria um certificado de serviço com o nome de domínio totalmente qualificado do computador e exporta o certificado de serviço para um arquivo chamado Service.cer.
Edite Web.config para que ele reflita o novo nome do certificado (no atributo
findValue
em <serviceCertificate>), que é o mesmo que o nome de domínio totalmente qualificado do computador.Copie o arquivo Service.cer do diretório de serviço para o diretório do cliente no computador cliente.
No cliente, execute o cliente do setup.bat em um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios de administrador. A execução do setup.bat com o argumento do cliente cria um certificado de cliente chamado client.com e exporta o certificado do cliente para um arquivo chamado Client.cer.
No arquivo Client.exe.config do computador cliente, altere o valor do endereço do ponto de extremidade para que ele corresponda ao novo endereço do serviço. Faça isso substituindo localhost pelo nome de domínio totalmente qualificado do servidor.
Copie o arquivo Client.cer do diretório do cliente para o diretório de serviço no servidor.
No cliente, execute ImportServiceCert.bat em um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios administrativos. Isso importará o certificado de serviço do arquivo Service.cer para o repositório CurrentUser - TrustedPeople.
No servidor, execute ImportClientCert.bat em um Prompt de Comando do Desenvolvedor para Visual Studio com privilégios administrativos. Isso importará o certificado do cliente do arquivo Client.cer para o repositório LocalMachine – TrustedPeople.
No computador cliente, inicialize Client.exe a partir de uma janela do prompt de comando. Se o cliente e o serviço não puderem se comunicar, confira Dicas de solução de problemas para exemplos de WCF.
Para limpar após a amostra
Execute Cleanup.bat na pasta de amostras depois de concluir a execução da amostra.
Observação
Esse script não remove os certificados de serviço em um cliente na execução dessa amostra em vários computadores. Se você tiver executado exemplos do WCF (Windows Communication Foundation) que usam certificados em computadores, lembre-se de limpar os certificados de serviço que foram instalados no repositório CurrentUser – TrustedPeople. Para fazer isso, use o seguinte comando:
certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>
Por exemplo:certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com
.