Trabalhar com SSL na API da Web

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

Habilitando o SSL no servidor

Para configurar o SSL no IIS 7 ou posterior:

  • Criar ou obter um certificado. Para teste, você pode criar um certificado autoassinado.
  • Adicione uma associação HTTPS.

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

Para testes locais, você pode habilitar o SSL em IIS Express do Visual Studio. No janela Propriedades, defina SSL Habilitado como True. Observe o valor da URL SSL; use essa URL para testar conexões HTTPS.

Imagem de SSL habilitada como true em propriedades

Impondo o SSL em um controlador de API da Web

Se você tiver uma associaçã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 abaixo mostra um filtro de autenticação de API da Web que verifica o 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 esse filtro às ações de API da Web que exigem 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 autentique o servidor no 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 aplicativo, essa não será uma boa experiência do usuário, mas em alguns ambientes (por exemplo, empresa) pode ser viável.

Vantagens Desvantagens
– As credenciais de certificado são mais fortes que o nome de usuário/senha. – O SSL fornece um canal seguro completo, com autenticação, integridade da mensagem e criptografia de mensagem. – Você deve obter e gerenciar certificados PKI. – A plataforma cliente deve dar suporte a 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 no modo de exibição de árvore.

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

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

    • Aceitar: o IIS aceitará um certificado do cliente, mas não exigirá um.
    • Exigir: exigir um certificado do cliente. (Para habilitar essa 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 sinalizador SslNegotiateCert significa que o IIS aceitará um certificado do cliente, mas não exigirá um (equivalente à opção "Aceitar" no Gerenciador do IIS). Para exigir um certificado, defina o sinalizador SslRequireCert . Para teste, você também pode definir essas opções em IIS Express, no arquivo de applicationhost.Config local, 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 do cliente. Primeiro, crie uma autoridade raiz de teste:

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

O Makecert solicitará que você insira uma senha para a chave privada.

Em seguida, adicione o certificado ao repositório "Autoridades de Certificação Raiz Confiáveis" do servidor de teste, da seguinte maneira:

  1. Abra o MMC.
  2. Em Arquivo, selecione Adicionar/Remover Snap-In.
  3. Selecione Conta do Computador.
  4. Selecione Computador local e conclua o assistente.
  5. No painel de navegação, expanda o nó "Autoridades de Certificação Raiz Confiáveis".
  6. No menu Ação , aponte para Todas as Tarefas e clique em Importar para iniciar o Assistente de Importação de Certificados.
  7. Navegue até o arquivo de certificado, TempCA.cer.
  8. Clique em Abrir e, em seguida, clique em Avançar e conclua o assistente. (Será solicitado que você insira novamente a senha.)

Agora, crie um certificado de cliente 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 Web

No lado do servidor, você pode obter o certificado do cliente chamando GetClientCertificate na mensagem de solicitação. O método retornará nulo se não houver nenhum certificado do cliente. Caso contrário, retornará uma instância X509Certificate2 . Use esse 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;