Partilhar via


Trabalhando com SSL na API Web

Vários esquemas de autenticação comuns não são seguros em HTTP simples. Em particular, a autenticação básica e a autenticação de formulários enviam credenciais não criptografadas. Para serem seguros, esses esquemas de autenticação devem usar SSL. Além disso, os certificados de cliente SSL podem ser usados para autenticar clientes.

Ativando o SSL no Servidor

Para configurar o SSL no IIS 7 ou posterior:

  • Crie ou obtenha um certificado. Para testes, você pode criar um certificado autoassinado.
  • Adicione uma ligação HTTPS.

Para obter detalhes, consulte Como configurar o SSL no IIS 7.

Para testes locais, você pode habilitar o SSL no IIS Express do Visual Studio. Na janela Propriedades, configure SSL Enabled como True. Observe o valor de URL SSL; use essa URL para testar conexões HTTPS.

Imagem de S S L ativada true nas propriedades

Impondo SSL em um controlador de API da Web

Se você tiver uma ligação HTTPS e HTTP, os clientes ainda poderão usar HTTP para acessar o site. Você pode permitir que alguns recursos estejam disponíveis por meio de HTTP, enquanto outros recursos exigem SSL. Nesse caso, use um filtro de ação para exigir SSL para os recursos protegidos. O código a seguir mostra um filtro de autenticação de API da Web que verifica SSL:

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
            {
                ReasonPhrase = "HTTPS Required"
            };
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

Adicione este filtro a todas as ações da API Web que exijam SSL:

public class ValuesController : ApiController
{
    [RequireHttps]
    public HttpResponseMessage Get() { ... }
}

Certificados de cliente SSL

O SSL fornece autenticação usando certificados de Infraestrutura de Chave Pública. O servidor deve fornecer um certificado que autentica o servidor para o cliente. É menos comum que o cliente forneça um certificado ao servidor, mas essa é uma opção para autenticar clientes. Para usar certificados de cliente com SSL, você precisa de uma maneira de distribuir certificados assinados para seus usuários. Para muitos tipos de aplicativos, isso não será uma boa experiência do usuário, mas em alguns ambientes (por exemplo, empresarial) pode ser viável.

Vantagens Desvantagens
- As credenciais do certificado são mais fortes do que o nome de usuário/senha. - O SSL fornece um canal seguro completo, com autenticação, integridade da mensagem e criptografia da mensagem. - Você deve obter e gerenciar certificados PKI. - A plataforma do cliente deve suportar certificados de cliente SSL.

Para configurar o IIS para aceitar certificados de cliente, abra o Gerenciador do IIS e execute as seguintes etapas:

  1. Clique no nó do site na visualização em árvore.

  2. Clique duas vezes no recurso Configurações de SSL no painel central.

  3. Em Certificados de Cliente, selecione uma destas opções:

    • Aceitar: o IIS aceitará um certificado do cliente, mas não requer um.
    • Exigir: Exigir um certificado de cliente. (Para ativar esta opção, você também deve selecionar "Exigir SSL")

Você também pode definir essas opções no arquivo ApplicationHost.config:

<system.webServer>
    <security>
        <access sslFlags="Ssl, SslNegotiateCert" />
        <!-- To require a client cert: -->
        <!-- <access sslFlags="Ssl, SslRequireCert" /> -->
    </security>
</system.webServer>

O flag SslNegotiateCert significa que o IIS aceitará um certificado do cliente, mas não exige um (equivalente à opção "Aceitar" no Gestor do IIS). Para exigir um certificado, defina o sinalizador SslRequireCert. Para testes, você também pode definir essas opções no IIS Express, no applicationhost local. Arquivo de configuração, localizado em "Documents\IISExpress\config".

Criando um certificado de cliente para teste

Para fins de teste, você pode usar MakeCert.exe para criar um certificado de cliente. Primeiro, crie uma autoridade raiz de teste:

makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer

Makecert irá pedir-lhe para introduzir uma palavra-passe para a chave privada.

Em seguida, adicione o certificado ao armazenamento "Autoridades de certificação raiz confiáveis" do servidor de teste, da seguinte maneira:

  1. Abra o MMC.
  2. Em Ficheiro , selecione Adicionar/Remover Snap-In.
  3. Em Snap-ins disponíveis, selecione Certificadose, depois, clique em Adicionar.
  4. Selecione Conta de Computador.
  5. Selecione computador local e conclua o assistente.
  6. No painel de navegação, expanda o nó "Autoridades de certificação raiz confiáveis".
  7. No menu Ação, aponte para Todas as Tarefase clique em Importar para iniciar o Assistente para Importação de Certificados.
  8. Navegue até o arquivo de certificado, TempCA.cer.
  9. Clique Abrir, depois clique Avançar e complete o assistente. (Ser-lhe-á pedido que volte a introduzir a palavra-passe.)

Agora crie um certificado de cliente que seja assinado pelo primeiro certificado:

makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name" 
     -eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk

Usando certificados de cliente na API da Web

No lado do servidor, você pode obter o certificado do cliente chamando GetClientCertificate na mensagem de solicitação. O método retorna null se não houver nenhum certificado de cliente. Caso contrário, ele retorna uma X509Certificate2 instância. Use este objeto para obter informações do certificado, como o emissor e o assunto. Em seguida, você pode usar essas informações para autenticação e/ou autorização.

X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;