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.
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.
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.
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.