Delen via


Werken met SSL in web-API

Verschillende algemene verificatieschema's zijn niet beveiligd via gewone HTTP. Specifiek bij basisverificatie en formulierverificatie worden niet-versleutelde inloggegevens verzonden. Om veilig te zijn, moeten deze verificatieschema's SSL gebruiken. Daarnaast kunnen SSL-clientcertificaten worden gebruikt om clients te verifiëren.

SSL inschakelen op de server

SSL instellen in IIS 7 of hoger:

  • Maak of haal een certificaat op. Voor het testen kunt u een zelfondertekend certificaat maken.
  • Voeg een HTTPS-binding toe.

Zie SSL instellen op IIS 7voor meer informatie.

Voor lokale tests kunt u SSL in IIS Express inschakelen vanuit Visual Studio. Stel in het venster Eigenschappen SSL ingeschakelde in op True. Noteer de waarde van SSL-URL; gebruik deze URL voor het testen van HTTPS-verbindingen.

afbeelding van SSL ingeschakeld waar in eigenschappen

SSL afdwingen in een web-API-controller

Als u zowel een HTTPS- als een HTTP-binding hebt, kunnen clients nog steeds HTTP gebruiken voor toegang tot de site. U kunt toestaan dat sommige resources beschikbaar zijn via HTTP, terwijl voor andere resources SSL is vereist. In dat geval gebruikt u een actiefilter om SSL te vereisen voor de beveiligde resources. De volgende code toont een web-API-verificatiefilter dat controleert op 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);
        }
    }
}

Voeg dit filter toe aan web-API-acties waarvoor SSL is vereist:

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

SSL-clientcertificaten

SSL biedt verificatie met behulp van Public Key Infrastructure-certificaten. De server moet een certificaat opgeven waarmee de server wordt geverifieerd bij de client. Het is minder gebruikelijk dat de client een certificaat aan de server levert, maar dit is een optie voor het verifiëren van clients. Als u clientcertificaten met SSL wilt gebruiken, hebt u een manier nodig om ondertekende certificaten te distribueren naar uw gebruikers. Voor veel toepassingstypen is dit geen goede gebruikerservaring, maar in sommige omgevingen (bijvoorbeeld onderneming) is het mogelijk haalbaar.

Voordelen Nadelen
- Certificaatreferenties zijn sterker dan gebruikersnaam/wachtwoord. - SSL biedt een volledig beveiligd kanaal, met verificatie, berichtintegriteit en berichtversleuteling. - U moet PKI-certificaten verkrijgen en beheren. - Het clientplatform moet SSL-clientcertificaten ondersteunen.

Als u IIS wilt configureren voor het accepteren van clientcertificaten, opent u IIS Manager en voert u de volgende stappen uit:

  1. Klik op het siteknooppunt in de structuurweergave.

  2. Dubbelklik op de functie SSL-instellingen in het middelste deelvenster.

  3. Selecteer onder clientcertificateneen van de volgende opties:

    • Accepteren: IIS accepteert een certificaat van de client, maar er is geen certificaat vereist.
    • Vereisen: Een clientcertificaat vereisen. (Als u deze optie wilt inschakelen, moet u ook SSL vereisen selecteren)

U kunt deze opties ook instellen in het ApplicationHost.config-bestand:

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

De SslNegotiateCert vlag betekent dat IIS een certificaat van de client accepteert, maar er is geen certificaat vereist (vergelijkbaar met de optie Accepteren in IIS Manager). Om een certificaat te vereisen, moet u de vlag SslRequireCert instellen. Voor het testen kunt u deze opties ook instellen in IIS Express, in de lokale applicationhost. Configuratiebestand, dat zich in Documenten\IISExpress\config bevindt.

Een clientcertificaat maken voor testen

Voor testdoeleinden kunt u MakeCert.exe gebruiken om een clientcertificaat te maken. Maak eerst een testhoofdinstantie:

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

Makecert vraagt u om een wachtwoord in te voeren voor de persoonlijke sleutel.

Voeg vervolgens het certificaat als volgt toe aan het archief vertrouwde basiscertificeringsinstanties van de testserver:

  1. Open MMC.
  2. Selecteer in Bestandde optie Invoegtoepassing toevoegen/verwijderen.
  3. Selecteer onder Beschikbare modulesde optie Certificatenen klik vervolgens op toevoegen.
  4. Selecteer Computeraccount.
  5. Selecteer lokale computer en voltooi de wizard.
  6. Vouw onder het navigatiedeelvenster het knooppunt Vertrouwde basiscertificeringsinstanties uit.
  7. Wijs in het menu Actie aan Alle Taken, en klik vervolgens op Importeren om de Certificaat-Import Wizard te starten.
  8. Blader naar het certificaatbestand TempCA.cer.
  9. Klik op openen en klik vervolgens op Volgende en voltooi de wizard. (U wordt gevraagd het wachtwoord opnieuw in te voeren.)

Maak nu een clientcertificaat dat is ondertekend door het eerste certificaat:

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

Clientcertificaten gebruiken in web-API

Aan de serverzijde kunt u het clientcertificaat ophalen door GetClientCertificate- aan te roepen in het aanvraagbericht. De methode retourneert null als er geen clientcertificaat is. Anders wordt een X509Certificate2 exemplaar geretourneerd. Gebruik dit object om informatie op te halen uit het certificaat, zoals de uitgever en het onderwerp. Vervolgens kunt u deze informatie gebruiken voor verificatie en/of autorisatie.

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