Compartilhar certificados entre aplicativos

Os aplicativos da Plataforma Universal do Windows (UWP) que exigem autenticação segura além de uma combinação de ID de usuário e senha podem usar certificados para autenticação. A autenticação de certificado oferece um elevado nível de confiança ao autenticar um usuário. Em alguns casos, um grupo de serviços desejará autenticar um usuário para vários aplicativos. Este artigo mostra como você pode autenticar vários aplicativos usando o mesmo certificado e fornecer código prático para que um usuário importe um certificado que foi fornecido para acessar serviços Web seguros.

Os aplicativos podem se autenticar em um serviço Web usando um certificado e vários aplicativos podem usar um único certificado do repositório de certificados para autenticar o mesmo usuário. Se um certificado não existir no repositório, você poderá adicionar código ao seu aplicativo para importar um certificado de um arquivo PFX.

Habilitar o IIS (Serviços de Informações da Internet) da Microsoft e o mapeamento de certificado do cliente

Este artigo usa o IIS (Serviços de Informações da Internet) da Microsoft para fins de exemplo. O IIS não está habilitado por padrão. Você pode habilitar o IIS usando o Painel de Controle.

  1. Abra o Painel de Controle e selecione Programas.
  2. Selecione Ativar ou desativar os recursos do Windows.
  3. Expanda os Serviços de Informações da Internet e, em seguida, expanda os Serviços da World Wide Web. Expanda Recursos de desenvolvimento de aplicativos e selecione ASP.NET 3.5 e ASP.NET 4.5. Fazer essas seleções ativará automaticamente os Serviços de Informações da Internet.
  4. Clique em OK para aplicar as alterações.

Criar e publicar um serviço Web seguro

  1. Execute o Microsoft Visual Studio como administrador e selecione Novo Projeto na página inicial. O acesso de administrador é necessário para publicar um serviço Web em um servidor IIS. Na caixa de diálogo Novo Projeto, altere a estrutura para .NET Framework 3.5. Selecione Visual C# ->Web ->Visual Studio ->ASP.NET Aplicativo de Serviço Web. Nomeie o aplicativo como "FirstContosoBank". Clique em OK para criar o projeto.

  2. No arquivo Service1.asmx.cs, substitua o método da Web padrão HelloWorld pelo seguinte método "Login".

            [WebMethod]
            public string Login()
            {
                // Verify certificate with CA
                var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(
                    this.Context.Request.ClientCertificate.Certificate);
                bool test = cert.Verify();
                return test.ToString();
            }
    
  3. Salve o arquivo Service1.asmx.cs .

  4. No Gerenciador de Soluções, clique com o botão direito do mouse no aplicativo "FirstContosoBank" e selecione Publicar.

  5. Na caixa de diálogo Publicar Web, crie um novo perfil e nomeie-o como "ContosoProfile". Clique em Avançar.

  6. Na próxima página, insira o nome do servidor para o servidor IIS e especifique um nome de site de "Site Padrão/FirstContosoBank". Clique em Publicar para publicar seu serviço Web.

Configurar seu serviço Web para usar a autenticação de certificado do cliente

  1. Execute o Gerenciador de Serviços de Informações da Internet (IIS).
  2. Expanda os sites do servidor IIS. No Site Padrão, selecione o novo serviço Web "FirstContosoBank". Na seção Ações, selecione Configurações avançadas....
  3. Defina o Pool de Aplicativos como .NET v2.0 e clique em OK.
  4. No Gerenciador do IIS (Serviços de Informações da Internet), selecione o servidor IIS e clique duas vezes em Certificados do Servidor. Na seção Ações, selecione Criar certificado autoassinado.... Insira "ContosoBank" como o nome amigável do certificado e clique em OK. Isso criará um novo certificado para uso pelo servidor IIS na forma de "<server-name>.<nome> de domínio".
  5. No Gerenciador de Serviços de Informações da Internet (IIS), selecione o site padrão. Na seção Ações, selecione Vinculação e clique em Adicionar.... Selecione "https" como o tipo, defina a porta como "443" e insira o nome completo do host do servidor IIS ("<nome> do servidor.<nome> de domínio"). Defina o certificado SSL como "ContosoBank". Clique em OK. Clique em Fechar na janela Vinculações do Site.
  6. No Gerenciador dos Serviços de Informações da Internet (IIS), selecione o serviço Web "FirstContosoBank". Clique duas vezes em Configurações de SSL. Marque Exigir SSL. Em Certificados de cliente, selecione Exigir. Na seção Ações, clique em Aplicar.
  7. Você pode verificar se o serviço da Web está configurado corretamente abrindo o navegador da Web e digitando o seguinte endereço da Web: "https://< server-name>.<nome> de domínio/FirstContosoBank/Service1.asmx". (Por exemplo, "https://myserver.example.com/FirstContosoBank/Service1.asmx". Se o seu serviço Web estiver configurado corretamente, você será solicitado a selecionar um certificado de cliente para acessar o serviço Web.

Você pode repetir as etapas anteriores para criar vários serviços da Web que podem ser acessados usando o mesmo certificado de cliente.

Criar um aplicativo UWP que usa autenticação de certificado

Agora que você tem um ou mais serviços Web protegidos, seus aplicativos podem usar certificados para se autenticar nesses serviços Web. Quando você faz uma solicitação para um serviço Web autenticado usando o objeto HttpClient , a solicitação inicial não conterá um certificado de cliente. O serviço Web autenticado responderá com uma solicitação de autenticação do cliente. Quando isso ocorrer, o cliente Windows consultará automaticamente o repositório de certificados para obter os certificados de cliente disponíveis. Seu usuário pode selecionar entre esses certificados para autenticar no serviço Web. Alguns certificados são protegidos por senha, portanto, você precisará fornecer ao usuário uma maneira de inserir a senha de um certificado.

Se não houver certificados de cliente disponíveis, o usuário precisará adicionar um certificado ao repositório de certificados. Você pode incluir código em seu aplicativo que permite que um usuário selecione um arquivo PFX que contenha um certificado de cliente e, em seguida, importe esse certificado para o repositório de certificados do cliente.

Dica Você pode usar makecert.exe para criar um arquivo PFX a ser usado com este guia de início rápido. Para obter informações sobre como usar makecert.exe, consulte MakeCert.

 

  1. Abra o Visual Studio e crie um novo projeto na página inicial. Nomeie o novo projeto como "FirstContosoBankApp". Clique em OK para criar o projeto.

  2. No arquivo MainPage.xaml, adicione o XAML a seguir ao elemento Grid padrão. Esse XAML inclui um botão para procurar um arquivo PFX a ser importado, uma caixa de texto para inserir uma senha para um arquivo PFX protegido por senha, um botão para importar um arquivo PFX selecionado, um botão para fazer logon no serviço Web protegido e um bloco de texto para exibir o status da ação atual.

    <Button x:Name="Import" Content="Import Certificate (PFX file)" HorizontalAlignment="Left" Margin="352,305,0,0" VerticalAlignment="Top" Height="77" Width="260" Click="Import_Click" FontSize="16"/>
    <Button x:Name="Login" Content="Login" HorizontalAlignment="Left" Margin="611,305,0,0" VerticalAlignment="Top" Height="75" Width="240" Click="Login_Click" FontSize="16"/>
    <TextBlock x:Name="Result" HorizontalAlignment="Left" Margin="355,398,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="153" Width="560"/>
    <PasswordBox x:Name="PfxPassword" HorizontalAlignment="Left" Margin="483,271,0,0" VerticalAlignment="Top" Width="229"/>
    <TextBlock HorizontalAlignment="Left" Margin="355,271,0,0" TextWrapping="Wrap" Text="PFX password" VerticalAlignment="Top" FontSize="18" Height="32" Width="123"/>
    <Button x:Name="Browse" Content="Browse for PFX file" HorizontalAlignment="Left" Margin="352,189,0,0" VerticalAlignment="Top" Click="Browse_Click" Width="499" Height="68" FontSize="16"/>
    <TextBlock HorizontalAlignment="Left" Margin="717,271,0,0" TextWrapping="Wrap" Text="(Optional)" VerticalAlignment="Top" Height="32" Width="83" FontSize="16"/>
    
  3. Salve o arquivo MainPage.xaml.

  4. No arquivo MainPage.xaml.cs, adicione as seguintes instruções using.

    using Windows.Web.Http;
    using System.Text;
    using Windows.Security.Cryptography.Certificates;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    using Windows.Storage.Streams;
    
  5. No arquivo MainPage.xaml.cs, adicione as seguintes variáveis à classe MainPage . Eles especificam o endereço para o método "Logon" seguro do serviço Web "FirstContosoBank" e uma variável global que contém um certificado PFX a ser importado para o repositório de certificados. Atualize o nome> do <servidor para o nome de servidor totalmente qualificado do servidor Microsoft Internet Information Server (IIS).

    private Uri requestUri = new Uri("https://<server-name>/FirstContosoBank/Service1.asmx?op=Login");
    private string pfxCert = null;
    
  6. No arquivo MainPage.xaml.cs, adicione o seguinte manipulador de cliques para o botão de login e o método para acessar o serviço Web seguro.

    private void Login_Click(object sender, RoutedEventArgs e)
    {
        MakeHttpsCall();
    }
    
    private async void MakeHttpsCall()
    {
    
        StringBuilder result = new StringBuilder("Login ");
        HttpResponseMessage response;
        try
        {
            Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient();
            response = await httpClient.GetAsync(requestUri);
            if (response.StatusCode == HttpStatusCode.Ok)
            {
                result.Append("successful");
            }
            else
            {
                result = result.Append("failed with ");
                result = result.Append(response.StatusCode);
            }
        }
        catch (Exception ex)
        {
            result = result.Append("failed with ");
            result = result.Append(ex.Message);
        }
    
        Result.Text = result.ToString();
    }
    
  7. No arquivo MainPage.xaml.cs, adicione os seguintes manipuladores de cliques para o botão para procurar um arquivo PFX e o botão para importar um arquivo PFX selecionado para o repositório de certificados.

    private async void Import_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            Result.Text = "Importing selected certificate into user certificate store....";
            await CertificateEnrollmentManager.UserCertificateEnrollmentManager.ImportPfxDataAsync(
                pfxCert,
                PfxPassword.Password,
                ExportOption.Exportable,
                KeyProtectionLevel.NoConsent,
                InstallOptions.DeleteExpired,
                "Import Pfx");
    
            Result.Text = "Certificate import succeeded";
        }
        catch (Exception ex)
        {
            Result.Text = "Certificate import failed with " + ex.Message;
        }
    }
    
    private async void Browse_Click(object sender, RoutedEventArgs e)
    {
    
        StringBuilder result = new StringBuilder("Pfx file selection ");
        FileOpenPicker pfxFilePicker = new FileOpenPicker();
        pfxFilePicker.FileTypeFilter.Add(".pfx");
        pfxFilePicker.CommitButtonText = "Open";
        try
        {
            StorageFile pfxFile = await pfxFilePicker.PickSingleFileAsync();
            if (pfxFile != null)
            {
                IBuffer buffer = await FileIO.ReadBufferAsync(pfxFile);
                using (DataReader dataReader = DataReader.FromBuffer(buffer))
                {
                    byte[] bytes = new byte[buffer.Length];
                    dataReader.ReadBytes(bytes);
                    pfxCert = System.Convert.ToBase64String(bytes);
                    PfxPassword.Password = string.Empty;
                    result.Append("succeeded");
                }
            }
            else
            {
                result.Append("failed");
            }
        }
        catch (Exception ex)
        {
            result.Append("failed with ");
            result.Append(ex.Message); ;
        }
    
        Result.Text = result.ToString();
    }
    
  8. Execute seu aplicativo e faça logon no serviço Web protegido, bem como importe um arquivo PFX para o repositório de certificados local.

Você pode usar essas etapas para criar vários aplicativos que usam o mesmo certificado de usuário para acessar os mesmos serviços Web protegidos ou diferentes.