Partager via


Utilisation de SSL dans l’API web

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

Activation du protocole 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 la fenêtre Propriétés, réglez SSL Enabled sur True. Notez la valeur de URL SSL; utilisez cette URL pour tester les connexions HTTPS.

Capture d’écran de SSL Enabled True dans les propriétés.

Application du protocole SSL dans un contrôleur d’API web

Si vous disposez à la fois d’une liaison HTTPS et 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 d’API web qui nécessitent SSL :

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

Certificats client SSL

SSL fournit l’authentification à l’aide de certificats d’infrastructure de 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, cela ne sera pas une bonne expérience utilisateur, mais dans certains environnements (par exemple, entreprise), il peut être possible.

Avantages Inconvénients
- Les informations d’identification du 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 des certificats PKI. - La plateforme cliente doit prendre en charge les certificats clients SSL.

Pour configurer IIS pour accepter des certificats clients, ouvrez le Gestionnaire IIS et effectuez les étapes suivantes :

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

  2. Double-cliquez sur la fonctionnalité paramètres SSL (SSL Parameters) dans le volet central.

  3. Sous certificats client, sélectionnez l’une de ces options :

    • Accepter: IIS accepte un certificat du client, mais n’en a pas besoin.
    • 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 que IIS accepte un certificat du client, mais ne nécessite pas un certificat (équivalent à l’option « Accepter » dans le Gestionnaire IIS). Pour exiger un certificat, définissez l’indicateur SslRequireCert. Pour les tests, vous pouvez également définir ces options dans IIS Express, dans l’hôte d’application local. Fichier de configuration, 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 dans le magasin « Trusted Root Certification Authorities » du serveur de test, comme suit :

  1. Ouvrez MMC.
  2. Dans le menu Fichier (File), sélectionnez Ajouter/Supprimer un composant logiciel enfichable (Add/Remove Snap-In).
  3. Dans Composants logiciels enfichables disponibles (Available snap-ins), sélectionnez Certificats, puis cliquez sur Ajouter.
  4. Sélectionnez Compte d’ordinateur (Computer Account).
  5. Sélectionnez Ordinateur local (Local Computer) et terminez l’assistant.
  6. Dans le volet de navigation, développez le nœud « Trusted Root Certification Authorities ».
  7. Dans le menu Action, pointez sur Toutes les tâches (All Tasks), puis cliquez sur Importer (Import) pour démarrer l’assistant d’importation de certificats.
  8. Accédez au fichier de certificat, TempCA.cer.
  9. Cliquez sur Ouvrir (Open), puis cliquez sur Suivant (Next) 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 requête. La méthode retourne null s’il n’existe aucun certificat client. Sinon, elle retourne une instance X509Certificate2. Utilisez cet objet pour obtenir des informations à partir du certificat, telles que l’émetteur et le sujet. 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;