Uwierzytelnianie w sieci przy użyciu certyfikatów PKI


14

Rozumiem PKI dość dobrze z koncepcyjnego punktu widzenia - tj. Kluczy prywatnych / kluczy publicznych - matematyki za nimi, użycia skrótu i ​​szyfrowania do podpisania certyfikatu, cyfrowego podpisywania transakcji lub dokumentów itp. Pracowałem również nad projektami, w których openssl Biblioteki C były używane z certyfikatami do zabezpieczenia komunikacji i uwierzytelniania. Bardzo dobrze znam też narzędzia wiersza poleceń openssl.

Mam jednak bardzo małe doświadczenie z projektami opartymi na PKI i dlatego staram się zaprojektować i zakodować osobisty projekt, aby lepiej to zrozumieć.

Wymagania

To jest strona internetowa banku. Wszyscy użytkownicy bankowości internetowej mogą używać dowolnego certyfikatu wydanego przez kilka znanych urzędów certyfikacji (verisign, Thawte, powierzenie itp.). Bank nie ponosi odpowiedzialności za pozyskiwanie certyfikatów dla użytkownika. Certyfikaty te zostaną wykorzystane do uwierzytelnienia na stronie internetowej banków. Platformy / system operacyjny itp. Nadal nie są naprawione.

Projekt

Zastanawiałem się, jaki jest najlepszy sposób na uwierzytelnienie.

  1. Widziałem, że Apache ma sposób na włączenie 2-drożnego ssl - w tym przypadku myślę, że przejście do strony internetowej automatycznie poprosiłoby użytkownika o certyfikat. Ale nie jestem pewien, czy to wystarczy, ponieważ wydaje się, że wszystko, co weryfikuje, to to, czy certyfikat jest podpisany przez zaufany urząd certyfikacji, a także może znajdować się na białej liście linii tematycznych certyfikatów itp. Ale to nie wystarczy dla sprawy bankowej, ponieważ musisz być w stanie powiązać bankserid z certyfikatem.

  2. Wydaje się, że usługi IIS umożliwiają przechowywanie certyfikatu dla każdego użytkownika w usłudze Active Directory. Zrozumiałem to po przeczytaniu kilku artykułów MSDN. Włączasz dwukierunkowy protokół SSL w usługach IIS, a następnie, gdy użytkownik próbuje przejść do witryny, usługi IIS wyślą żądanie do przeglądarki z listą zatwierdzonych urzędów certyfikacji, a przeglądarka pozwoli użytkownikowi wybrać odpowiedni certyfikat ze swojego magazynu certyfikatów i wyśle ​​go do zaplecza. Zakładam, że IIS zrobi 2 rzeczy

    • Upewnij się, że użytkownik ma klucz prywatny odpowiadający certyfikatowi (w ramach negocjacji dotyczących ochrony ubezpieczeniowej)
    • Na podstawie mapowania certyfikatu użytkownika usługi AD IIS zgłosi nazwę użytkownika do aplikacji.
  3. Wykonaj jawność uwierzytelniania, wywołując funkcje kryptograficzne, w zależności od tego, w zależności od serwera WWW.

    • Pokaż ekran użytkownika, na którym przesyła certyfikat, a aplikacja upewnia się, że użytkownik ma klucz prywatny odpowiadający certyfikatowi (prosząc interfejs użytkownika o podpisanie jakiegoś ciągu za pomocą certyfikatu).
    • Aplikacja posiada bazę danych, w której przechowywane są niektóre dane, co pozwala każdemu użytkownikowi przypisać mapowanie do jego identyfikatora użytkownika. To może być
    • cały certyfikat odpowiadający każdemu identyfikatorowi użytkownika
    • numer seryjny urzędu certyfikacji i certyfikatu odpowiadający każdemu identyfikatorowi użytkownika.

Zastanawiałem się, jaka jest powszechnie stosowana metoda? Jakie są najlepsze praktyki? Jeśli powinienem przejść do punktu 3, jakie są najlepsze sposoby na to?

Dodatkową zaletą będzie coś, co z łatwością będzie działać z aplikacjami na smartfony.

Aktualizacja

Pozwól mi wyjaśnić moje stwierdzenie „sam koduj część uwierzytelniającą”, ponieważ niektóre odpowiedzi wydają się wskazywać, że zostało źle zrozumiane - moje złe, że nie było jasne.

To nie znaczy, że sam piszę rzeczy kryptograficzne. Oznacza to po prostu, że faktycznie wywołam procedury kryptograficzne jawnie zamiast polegać na IIS lub dowolnym innym serwerze internetowym, który robi to pośrednio.



@adnan - W swoim pytaniu pisałem już o „wzajemnym SSL z Apache” i dlaczego to by mi nie działało.
user93353

1
Dlaczego opinie negatywne? Jeśli dana osoba może zostawić komentarz, co jest nie tak z pytaniem - mogę spróbować go poprawić.
user93353

Tak, widziałem to. Nie mówię, że to duplikat, mówię tylko, że jest spokrewniony. Więcej informacji dla czytelnika Twojego pytania.
Adi

@Adnan - OK - martwiłem się, że ludzie mogą spojrzeć na link i zagłosować, aby zamknąć moje pytanie jako duplikat :-)
user93353

Odpowiedzi:


9

Chociaż naprawdę chciałem odpowiadać na każdy problem, myślę, że przejdę do tego tematu tematycznie:

Autoryzacja / Uwierzytelnianie

OK, najpierw najważniejsze. Na przykład potrzebujesz obu:

  • Uwierzytelnianie - dowód, że użytkownik jest tym, za kogo się podaje. Wybrałeś PKI, z domyślnym dowodem klucza prywatnego jako uwierzytelnienia.
  • Autoryzacja - połączenie użytkownika z tym, co jest dozwolone. Jest to punkt połączenia między zalogowaniem się a uzyskaniem dostępu do dozwolonych kont. Mapowanie certyfikatu na konto i możliwości dostępu do konta to autoryzacja.

Jeśli chodzi o autoryzację, masz problem ze zorientowaniem się, w jaki sposób podłączasz podmiotową nazwę użytkownika do jego konta bankowego. Biorąc pod uwagę powagę transakcji, zdecydowanie potrzebujesz silnego procesu i nie ma tu jednej właściwej drogi. Będziesz musiał skonsultować się z bankiem i prawdopodobnie prawnikami, aby dowiedzieć się, jak to zrobić zgodnie z zasadami.

SSL, uwierzytelnianie klienta / serwera, dowód klucza prywatnego

Protokół SSL zawsze obejmuje uwierzytelnianie serwera, z dodatkowym opcjonalnym ustawieniem autoryzacji po stronie klienta. Masz rację z numerem 1, ponieważ Apache oferuje ustawienie, które dodaje Uwierzytelnianie klienta przez PKI, i możesz zapewnić mu listę zaufanych urzędów certyfikacji. Podczas konfiguracji sesji SSL, która wymaga uwierzytelnienia klienta za pośrednictwem PKI, otrzymasz dowód klucza prywatnego.

Zapewni to opcja nr 1 lub opcja 2 - w ten sposób można skonfigurować zarówno Apache, jak i IIS. Jeśli chodzi o najlepsze praktyki, wybrałbym jedno z nich, aby wprowadzić własne rozwiązanie. # 3 niebezpiecznie zbliża się do zasady „nie pisz własnej kryptografii”. Zakładając, że możesz powiązać swoją transakcję z obecnością uwierzytelnionej sesji SSL, nie ma powodu, aby tworzyć własne.

Ponadto - w opcji nr 1 lub opcji 2 można uzyskać dostęp do całego certyfikatu, a stamtąd - do dowolnej części certyfikatu. Zazwyczaj nazwa wyróżniająca podmiotu i / lub numer seryjny certyfikatu są używane do ustalenia tożsamości użytkownika do celów autoryzacji.

Jeśli chodzi o „powszechne użycie” - wszystkie główne serwery sieciowe są dość powszechne. Usługi IIS, Apache, Tomcat i wiele innych można skonfigurować przy użyciu uwierzytelniania SSL klienta. Stamtąd decyzja w dużej mierze opiera się na ogólnym wdrażaniu. Wszystkie główne serwery sieciowe miały sposoby na uzyskanie dostępu do certyfikatu udostępnionego w sesji SSL, co jest potrzebne do bardziej szczegółowej weryfikacji.

Weryfikacja certyfikatu - dodatki

Co najmniej musisz:

  • skonfigurować sesję SSL
  • wyciągnij certyfikat (większość serwerów internetowych sprawdzi podpis certyfikatu i dowód klucza prywatnego)
  • sprawdź datę ważności certyfikatu (nie podaną na żadnym serwerze internetowym)
  • wykonać sprawdzenie autoryzacji, do których kont może uzyskać dostęp ten certyfikat

Biorąc pod uwagę wysokie stawki bankowe, możesz również chcieć sprawdzić status odwołania certyfikatu - jeśli klucz prywatny użytkownika zostanie zgubiony lub skradziony, jego certyfikat powinien zostać odwołany.

IIS może mieć haczyki do weryfikacji OCSP lub CRL - zwykle jest to bardziej kompleksowy system (trzymanie ręki!), Ale nie pamiętam z góry głowy. Nie pamiętam też, czy zmusi cię to do korzystania z produktów Microsoft. W przypadku Apache prawie na pewno będziesz musiał zakodować lub dodać kontrolę OCSP / CRL. Uważam, że ma haczyki podczas ustanawiania sesji SSL - zwykle ta kontrola jest przeprowadzana raz, gdy sesja SSL jest konfigurowana.

Upoważnienie

Na poziomie 1 i 2 - masz rację, że IIS ma wbudowaną funkcjonalność, która połączy certyfikat podany w sesji SSL z repozytorium AD. Jest to jeden z przypadków, w których Microsoft dokłada wszelkich starań, aby ułatwić kupowanie i korzystanie z większej liczby jego produktów. :) Istnieją niuanse, w jaki sposób IIS łączy się z AD, które są poza zakresem tego pytania i poza moim bezpośrednim wspomnieniem. Zrobiłem trochę szalonych rzeczy z IIS i AD, i ogólnie uważam, że kiedy robisz coś tak stosunkowo prostego, jak wyciąganie nazwy użytkownika na podstawie certyfikatu z repozytorium AD - prawdopodobnie nic ci nie jest. To wtedy, gdy wchodzisz w bardziej złożone problemy z przechowywaniem danych, dziwne wyszukiwania AD i szczególnie szalone (ale uzasadnione) rzeczy z PKI,

Z IIS nawet nadal - będziesz potrzebować czegoś dodanego do swojej struktury AD, lub gdzie indziej, powiązania nazwy użytkownika z kontem bankowym. Zwykle w bankowości użytkownik ma wiele kont. I 2 użytkowników może mieć wspólne konto, więc jest to relacja wiele do wielu.

Dla # 1 - tak, musisz napisać własny odnośnik. Musisz zakodować: - bazę danych lub hierarchię LDAP łączącą certyfikat z użytkownikiem i użytkownikiem z kontami użytkowników. Gwarantowana unikalna część certyfikatu to numer seryjny + nazwa wyróżniająca wystawcy. Często nazwa wyróżniająca podmiotu będzie działać, ale nie jest gwarantowana we wszystkich systemach PKI.

Tak zazwyczaj robią to programiści używający PKI do wysokiej klasy uwierzytelniania za pomocą Apache. Pracując w wielu z tych systemów, jeszcze nie spotkałem się z przypadkiem łatwego ponownego użycia autoryzacji, więc nigdy tak naprawdę nie widzę w tym wielkiego minusu - będę musiał mieć coś specjalistycznego z obu stron, ponieważ role / uprawnienia są nigdy łatwe.

To brzmi jak mieszanka nr 1 i nr 3 - moja silna rada: skorzystaj z natywnych możliwości dowolnej aplikacji / serwera WWW, którego używasz do generowania sesji SSL. Umożliwi to konfigurację przeglądarki do serwera za pomocą zapytania certyfikatu w standardowy, najlepszy sposób. Stamtąd, dzięki Apache, będziesz musiał stworzyć własny system autoryzacji. Usługi IIS przedstawią pomysł firmy Microsoft dotyczący tego, w jaki sposób powinno to działać.

Znany Gotchas

Przeprowadź kilka testów przeglądarki. Z roku na rok, od przeglądarki do przeglądarki, znajduję problemy z obsługą sesji SSL. Prawidłowe powiązanie sesji SSL z serią żądań stron internetowych i upewnienie się, że wylogowanie jest obsługiwane poprawnie, jest największym problemem. Ma to wiele wspólnego zarówno z serwerem, jak i oprogramowaniem przeglądarki. SSL jest na tyle stabilny, że gdy działa, zwykle działa, chociaż mogą występować problemy z IE i wszystkimi innymi.

W szczególności, kiedy ostatnio to robiłem, kwestia kodowania siły i limitu czasu sesji była bardzo ważna.

Smartfony

Dobry. Szczęście. dotyczy wszystkiego, co mogę powiedzieć. W ogóle nie jestem twórcą aplikacji mobilnych, ale do tej pory mam wrażenie, że w przeciętnym smartfonie obsługa certyfikatów PKI jest słaba lub nie istnieje.

Tak bardzo chciałbym, aby udowodniono, że się mylę.


2

Certyfikaty osobiste sprawdzają się przy okresowym odnawianiu certyfikatów (które ma za sobą dość solidny proces) i można je zaimplementować jako uwierzytelnianie „bez hasła”, które podobają się klientom

ale tam gdzie zawodzi

  • Koszt na certyfikat
  • kompatybilność z nowoczesnymi przeglądarkami
  • użytkownicy końcowi niepewnie wyciągają certyfikaty i przechowują klucze prywatne

pamiętaj, że nowoczesne certyfikaty osobiste ze znakiem sha-2 nie działają z Safari na iPadzie i wieloma nowoczesnymi przeglądarkami. Wynika to z faktu, że certyfikaty osobiste nigdy tak naprawdę nie wystartowały, jak sądzą organizacje certyfikujące. Wydanie 30 000 certyfikatów (co robimy) kosztuje mniej więcej tyle samo za certyfikat co niektóre typy tokenów sprzętowych.

Twoja strategia umożliwiania klientom znajdowania własnych certyfikatów nie jest tak naprawdę ważna. Obecnie trudno jest znaleźć dostawców certyfikatów osobistych i są one dość drogie - musisz upewnić się, że uzasadnienie biznesowe działa, w przeciwnym razie klienci po prostu nie kupią tego.


„Obecnie trudno jest znaleźć dostawców certyfikatów osobistych” - nie w moim kraju. Ludzie używają certyfikatów do bankowości, a także do składania deklaracji podatkowych drogą elektroniczną. Więc bardzo łatwo go zdobyć. Właśnie podałem przykłady urzędów certyfikacji, takich jak Thawte, Verisign, aby ludzie zrozumieli, że mówię o zewnętrznych urzędach certyfikacji.
user93353,

1

Dobra, dużo się tu dzieje. Po pierwsze, uwierzytelnianie certyfikatu klienta jest bezużyteczne, jeśli nie jest obsługiwane w punkcie końcowym. Mamy więc świetny post z Intrepidus dotyczący podstaw uwierzytelniania klienta w aplikacjach na smartfony .

Następnie pozwól, że gorąco sugeruję, abyś nie kodował własnej procedury uwierzytelniania. Jest wiele świetnych, sprawdzonych bibliotek, które sobie z tym radzą. Zaoszczędzisz sobie błędy w funkcjonalności i bezpieczeństwie, uruchamiając z dojrzałą biblioteką do autoryzacji. Użycie sprawdzonej, dojrzałej biblioteki do tego byłoby zdecydowanie najlepszą praktyką.

Następną najlepszą praktyką jest używanie katalogu do obsługi klienta: mapowanie certyfikatów. Więc będziesz patrzył na AD lub LDAP. Jak wspomniałeś, Windows i IIS sprawiają, że jest to dla Ciebie bardzo płynne. IIS.net ma dobre podsumowanie konfiguracji mapowania certyfikatów w IIS .

Jeśli rzucasz Apache, nie jest to tak proste. Wygląda na to, że mod_authz_ldap wykonuje mapowanie certyfikatów klienta, ale osobiście z nim nie pracowałem.

To prowadzi nas do logistyki faktycznego wdrożenia czegoś takiego. Nie podpisujesz certyfikatów użytkowników, więc potrzebujesz procesu ironclad dla użytkownika, który złoży certyfikat i sprawi, że Twoja aplikacja opublikuje go w katalogu. Chciałbym zobaczyć dwa czynniki: uwierzytelnianie hasła i SMS-a lub połączenie z zaufanym numerem. Wysłałbym do użytkownika wiadomość e-mail z informacją, że do jego konta dodano certyfikat. Pozwoliłbym użytkownikowi usunąć mapowanie certyfikatu użytkownika za pośrednictwem strony zarządzania kontem w aplikacji.

Chciałbym sprawdzić, co robią Google i Facebook, ustawiając pliki cookie dla zaufanych urządzeń, aby uniknąć dwóch czynników. Chciałbym mieć nowe urządzenia do uwierzytelniania dwuskładnikowego przed zezwoleniem na uwierzytelnianie tylko na podstawie certyfikatu.

Zastanowiłbym się również, jak poradzić sobie z odwołaniem certyfikatów użytkownika. Oznacza to sprawdzenie zewnętrznej listy odwołania certyfikatów (CRL). Co robisz, jeśli certyfikat klienta nie ma zdefiniowanego punktu dystrybucji listy CRL? Czy sprawdzasz listę CRL za każdym razem, gdy użytkownik loguje się lub zgodnie z harmonogramem w ramach zadania, ponieważ prawdopodobnie będzie używanych tylko kilka list CRL?

Naprawdę sprowadza się to do: skąd mam wiedzieć, że mogę ufać, że certyfikaty użytkowników nie zostały naruszone, i jak mam ufać, że mogę zmapować certyfikat X na użytkownika Y.


`Po pierwsze, uwierzytelnianie certyfikatu klienta jest bezużyteczne, jeśli nie jest obsługiwane w punkcie końcowym. - Co to znaczy?
user93353

Większość tej odpowiedzi w ogóle dotyczy mojego pytania. Doceniam wysiłek włożony w rozwiązanie problemów ubocznych - ale naprawdę interesuje mnie bardziej szczegółowa odpowiedź na moje aktualne pytanie. Wiem, że OCSP / CRL musi zostać wykonane - ale to nie dotyczy mojego pytania. Jak dokonać rejestracji nie jest częścią pytania.
user93353
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.