Praca z protokołem SSL w internetowym interfejsie API

Kilka typowych schematów uwierzytelniania nie jest bezpiecznych za pośrednictwem zwykłego protokołu HTTP. W szczególności uwierzytelnianie podstawowe i uwierzytelnianie formularzy wysyłają niezaszyfrowane poświadczenia. Aby zapewnić bezpieczeństwo, te schematy uwierzytelniania muszą używać protokołu SSL. Ponadto certyfikaty klienta SSL mogą służyć do uwierzytelniania klientów.

Włączanie protokołu SSL na serwerze

Aby skonfigurować protokół SSL w usługach IIS 7 lub nowszych:

  • Utwórz lub pobierz certyfikat. Na potrzeby testowania można utworzyć certyfikat z podpisem własnym.
  • Dodaj powiązanie HTTPS.

Aby uzyskać szczegółowe informacje, zobacz How to Set Up SSL on IIS 7 (Jak skonfigurować protokół SSL w usługach IIS 7).

Na potrzeby testowania lokalnego można włączyć protokół SSL w IIS Express z poziomu programu Visual Studio. W okno Właściwości ustaw wartość SSL Enabled na True. Zanotuj wartość adresu URL protokołu SSL; użyj tego adresu URL do testowania połączeń HTTPS.

Obraz przedstawiający wartość true z włączonym S S L we właściwościach

Wymuszanie protokołu SSL w kontrolerze internetowego interfejsu API

Jeśli masz zarówno protokół HTTPS, jak i powiązanie HTTP, klienci nadal mogą używać protokołu HTTP do uzyskiwania dostępu do lokacji. Niektóre zasoby mogą być dostępne za pośrednictwem protokołu HTTP, a inne zasoby wymagają protokołu SSL. W takim przypadku użyj filtru akcji, aby wymagać protokołu SSL dla chronionych zasobów. Poniższy kod przedstawia filtr uwierzytelniania internetowego interfejsu API, który sprawdza protokół 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);
        }
    }
}

Dodaj ten filtr do dowolnych akcji internetowego interfejsu API, które wymagają protokołu SSL:

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

Certyfikaty klienta SSL

Protokół SSL zapewnia uwierzytelnianie przy użyciu certyfikatów infrastruktury kluczy publicznych. Serwer musi podać certyfikat, który uwierzytelnia serwer na kliencie. Rzadziej klient udostępnia certyfikat serwerowi, ale jest to jedna z opcji uwierzytelniania klientów. Aby używać certyfikatów klienta z protokołem SSL, należy użyć sposobu dystrybuowania podpisanych certyfikatów do użytkowników. W przypadku wielu typów aplikacji nie będzie to dobre środowisko użytkownika, ale w niektórych środowiskach (na przykład w przedsiębiorstwie) może być możliwe.

Zalety Wady
— Poświadczenia certyfikatu są silniejsze niż nazwa użytkownika/hasło. — Protokół SSL zapewnia pełny bezpieczny kanał z uwierzytelnianiem, integralnością komunikatów i szyfrowaniem komunikatów. — Należy uzyskać certyfikaty PKI i zarządzać nimi. — Platforma kliencka musi obsługiwać certyfikaty klienta SSL.

Aby skonfigurować usługi IIS do akceptowania certyfikatów klienta, otwórz Menedżera usług IIS i wykonaj następujące kroki:

  1. Kliknij węzeł lokacji w widoku drzewa.

  2. Kliknij dwukrotnie funkcję Ustawienia protokołu SSL w środkowym okienku.

  3. W obszarze Certyfikaty klienta wybierz jedną z następujących opcji:

    • Zaakceptuj: usługi IIS akceptują certyfikat od klienta, ale nie wymagają go.
    • Wymagaj: wymagaj certyfikatu klienta. (Aby włączyć tę opcję, musisz również wybrać pozycję "Wymagaj protokołu SSL")

Te opcje można również ustawić w pliku ApplicationHost.config:

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

Flaga SslNegotiateCert oznacza, że usługi IIS akceptują certyfikat od klienta, ale nie wymagają certyfikatu (odpowiednik opcji "Akceptuj" w Menedżerze usług IIS). Aby wymagać certyfikatu, ustaw flagę SslRequireCert . Na potrzeby testowania można również ustawić te opcje w IIS Express w lokalnym pliku applicationhost.Config znajdującym się w folderze "Documents\IISExpress\config".

Tworzenie certyfikatu klienta na potrzeby testowania

Do celów testowych można użyć MakeCert.exe do utworzenia certyfikatu klienta. Najpierw utwórz testowy urząd główny:

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

Program Makecert wyświetli monit o wprowadzenie hasła dla klucza prywatnego.

Następnie dodaj certyfikat do magazynu "Zaufane główne urzędy certyfikacji" serwera testowego w następujący sposób:

  1. Otwórz program MMC.
  2. W obszarze Plik wybierz pozycję Dodaj/Usuń przystawkę.
  3. Wybierz pozycję Konto komputera.
  4. Wybierz pozycję Komputer lokalny i ukończ pracę kreatora.
  5. W okienku nawigacji rozwiń węzeł "Zaufane główne urzędy certyfikacji".
  6. W menu Akcja wskaż polecenie Wszystkie zadania, a następnie kliknij przycisk Importuj , aby uruchomić Kreatora importu certyfikatów.
  7. Przejdź do pliku certyfikatu TempCA.cer.
  8. Kliknij przycisk Otwórz, a następnie kliknij przycisk Dalej i ukończ pracę kreatora. (Zostanie wyświetlony monit o ponowne wprowadzenie hasła).

Teraz utwórz certyfikat klienta podpisany przez pierwszy certyfikat:

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

Używanie certyfikatów klienta w internetowym interfejsie API

Po stronie serwera możesz uzyskać certyfikat klienta, wywołując metodę GetClientCertificate w komunikacie żądania. Metoda zwraca wartość null, jeśli nie ma certyfikatu klienta. W przeciwnym razie zwraca wystąpienie X509Certificate2 . Użyj tego obiektu, aby uzyskać informacje z certyfikatu, takie jak wystawca i podmiot. Następnie możesz użyć tych informacji do uwierzytelniania i/lub autoryzacji.

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