Working with SSL in Web API (Utilisation de SSL dans l’API Web)

Plusieurs schémas d’authentification courants ne sont pas sécurisés sur HTTP brut. En particulier, l'authentification de base et l'authentification par formulaires envoient des informations d'identification non chiffrées. Pour être sécurisés, ces schémas d’authentification doivent utiliser SSL. En outre, les certificats clients SSL peuvent être utilisés pour authentifier les clients.

Activation de SSL sur le serveur

Pour configurer SSL dans IIS 7 ou version ultérieure :

  • Créez ou obtenez un certificat. Pour les tests, vous pouvez créer un certificat auto-signé.
  • Ajoutez une liaison HTTPS.

Pour plus d’informations, consultez Comment configurer SSL sur IIS 7.

Pour les tests locaux, vous pouvez activer SSL dans IIS Express à partir de Visual Studio. Dans le Fenêtre Propriétés, définissez SSL Activé surTrue. Notez la valeur de l’URL SSL ; utilisez cette URL pour tester les connexions HTTPS.

Image de SS L activé true dans les propriétés

Enforcing SSL in a Web API Controller (Application de SSL dans un contrôleur d’API Web)

Si vous disposez à la fois d’une liaison HTTPS et d’une liaison HTTP, les clients peuvent toujours utiliser HTTP pour accéder au site. Vous pouvez autoriser la disponibilité de certaines ressources via HTTP, tandis que d’autres ressources nécessitent SSL. Dans ce cas, utilisez un filtre d’action pour exiger SSL pour les ressources protégées. Le code suivant montre un filtre d’authentification d’API web qui recherche 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);
        }
    }
}

Ajoutez ce filtre à toutes les actions de l’API web nécessitant SSL :

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

Certificats clients SSL

SSL fournit l’authentification à l’aide de certificats d’infrastructure à clé publique. Le serveur doit fournir un certificat qui authentifie le serveur auprès du client. Il est moins courant pour le client de fournir un certificat au serveur, mais il s’agit d’une option pour l’authentification des clients. Pour utiliser des certificats clients avec SSL, vous avez besoin d’un moyen de distribuer des certificats signés à vos utilisateurs. Pour de nombreux types d’applications, il ne s’agit pas d’une bonne expérience utilisateur, mais dans certains environnements (par exemple, d’entreprise), cela peut être possible.

Avantages Inconvénients
- Les informations d’identification de certificat sont plus fortes que le nom d’utilisateur/mot de passe. - SSL fournit un canal sécurisé complet, avec l’authentification, l’intégrité des messages et le chiffrement des messages. - Vous devez obtenir et gérer les certificats PKI. - La plateforme cliente doit prendre en charge les certificats clients SSL.

Pour configurer IIS afin qu’il accepte les certificats clients, ouvrez le Gestionnaire des services Internet et effectuez les étapes suivantes :

  1. Cliquez sur le nœud de site dans l’arborescence.

  2. Double-cliquez sur la fonctionnalité Paramètres SSL dans le volet central.

  3. Sous Certificats clients, sélectionnez l’une des options suivantes :

    • Accepter : IIS accepte un certificat du client, mais n’en nécessite pas.
    • Exiger : Exiger un certificat client. (Pour activer cette option, vous devez également sélectionner « Exiger SSL »)

Vous pouvez également définir ces options dans le fichier ApplicationHost.config :

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

L’indicateur SslNegotiateCert signifie qu’IIS accepte un certificat du client, mais n’en nécessite pas un (équivalent à l’option « Accepter » dans le Gestionnaire des services Internet). Pour exiger un certificat, définissez l’indicateur SslRequireCert . Pour les tests, vous pouvez également définir ces options dans IIS Express, dans le fichier applicationhost.Config local, situé dans « Documents\IISExpress\config ».

Création d’un certificat client à des fins de test

À des fins de test, vous pouvez utiliser MakeCert.exe pour créer un certificat client. Tout d’abord, créez une autorité racine de test :

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

Makecert vous invite à entrer un mot de passe pour la clé privée.

Ensuite, ajoutez le certificat au magasin « Autorités de certification racines de confiance » du serveur de test, comme suit :

  1. Ouvrez MMC.
  2. Sous Fichier, sélectionnez Ajouter/supprimer un composant logiciel enfichable.
  3. Sélectionnez Compte d’ordinateur.
  4. Sélectionnez Ordinateur local et terminez l’Assistant.
  5. Sous le volet de navigation, développez le nœud « Autorités de certification racines approuvées ».
  6. Dans le menu Action , pointez sur Toutes les tâches, puis cliquez sur Importer pour démarrer l’Assistant Importation de certificat.
  7. Accédez au fichier de certificat TempCA.cer.
  8. Cliquez sur Ouvrir, puis sur Suivant et terminez l’Assistant. (Vous serez invité à entrer à nouveau le mot de passe.)

Créez maintenant un certificat client signé par le premier certificat :

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

Utilisation de certificats clients dans l’API web

Côté serveur, vous pouvez obtenir le certificat client en appelant GetClientCertificate sur le message de demande. La méthode retourne null s’il n’existe aucun certificat client. Sinon, il retourne un instance X509Certificate2. Utilisez cet objet pour obtenir des informations à partir du certificat, telles que l’émetteur et l’objet. Vous pouvez ensuite utiliser ces informations pour l’authentification et/ou l’autorisation.

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