Sprawdzenie czy certyfikat jest zaufany / prawidłowy.

0

Dzień dobry,
mam aplikacje webową, która obsługuje komunikacje szyfrowaną za pomocą certyfikatu SSL.
Jak mogę zrobić coś takiego że aplikacja po uruchomieniu przejdzie do okna logowania, ale wówczas gdy certyfikat SSL będzie zaufany, natomiast w przeciwnym wypadku wyświetli komunikat ostrzegawczy.
Korzystam z ASP.NET Core (Net 6)
Oto moje ustawienia:
appsettings.json

{
  "Kestrel": {
    "EndPoints": {
      "Https": {
        "Url": "https://svr:5001",
        "Certificate": {
          "Path": "cert.pfx",
          "Password": "magic1234"
        }
      }
    }
  },
....

Program.cs

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseKestrel(options =>
    {
        options.Listen(IPAddress.Any, 5001, listenOptions =>
        {
            listenOptions.UseHttps("cert.pfx", "magic1234");

        });

    });
.......
 app.UseHttpsRedirection();
1

Brzmi jak problem XY, więc najlepiej gdybyś wyjaśnił po co Ci to. Aczkolwiek odpowiadając na Twoje pytanie da się to zrobić prostym przekierowaniem: musisz mieć jednak odpalone dwie wersje aplikacji na osobnych portach, jedną z SSL a drugą bez. Tyle, że żadna współczesna przeglądarka nie pozwoli Ci na połączenie się ze stroną bez certyfikatu nie wprowadzając zmian w konfiguracji przeglądarki (about:config) - będziesz automatycznie przekierowywany zawsze na port 443 jeśli tam będzie wystawiona szyfrowana aplikacja.

0
phantom_wizard napisał(a):

Brzmi jak problem XY, więc najlepiej gdybyś wyjaśnił po co Ci to. Aczkolwiek odpowiadając na Twoje pytanie da się to zrobić prostym przekierowaniem: musisz mieć jednak odpalone dwie wersje aplikacji na osobnych portach, jedną z SSL a drugą bez. Tyle, że żadna współczesna przeglądarka nie pozwoli Ci na połączenie się ze stroną bez certyfikatu nie wprowadzając zmian w konfiguracji przeglądarki (about:config) - będziesz automatycznie przekierowywany zawsze na port 443 jeśli tam będzie wystawiona szyfrowana aplikacja.

Tak sobie pomyślałem aby coś takie dodać do aplikacji, ale jeżeli faktycznie tyle z tym problemów to sobie odpuszczę :)

0

Nie musisz tego robić.
Przeglądarka to zrobi za Ciebie, bo w przypadku niezaufanego certyfikatu pokaże użytkownikowi stosowny komunikat.

Chyba, że zupełnie nie zrozumiałem o co pytasz, no ale to musiałbyś wyjaśnić czego dokładnie oczekujesz, bo ani aktualny opis ani fragmenty kodu jak dla mnie tego nie wyjaśniają.

0
some_ONE napisał(a):

Nie musisz tego robić.
Przeglądarka to zrobi za Ciebie, bo w przypadku niezaufanego certyfikatu pokaże użytkownikowi stosowny komunikat.

Chyba, że zupełnie nie zrozumiałem o co pytasz, no ale to musiałbyś wyjaśnić czego dokładnie oczekujesz, bo ani aktualny opis ani fragmenty kodu jak dla mnie tego nie wyjaśniają.

Chodzi oto aby program akceptował wejście do programu wyłącznie gdy certyfikat SSL będzie zaufany :)

0
virusek391 napisał(a):

Chodzi oto aby program akceptował wejście do programu wyłącznie gdy certyfikat SSL będzie zaufany :)

No to przecież właśnie jest domyślne zachowanie, jeśli nie będzie zaufany to przeglądarka przerwie na etapie handshake'u i nic nie wyśle

0
obscurity napisał(a):
virusek391 napisał(a):

Chodzi oto aby program akceptował wejście do programu wyłącznie gdy certyfikat SSL będzie zaufany :)

No to przecież właśnie jest domyślne zachowanie, jeśli nie będzie zaufany to przeglądarka przerwie na etapie handshake'u i nic nie wyśle

Gdy wyświetla komunikat że certyfikat jest niezaufany użytkownik może go i tak zaakceptować i wówczas przeglądarka go przepuszcza do okna logowania,

3
virusek391 napisał(a):

Gdy wyświetla komunikat że certyfikat jest niezaufany użytkownik może go i tak zaakceptować i wówczas przeglądarka go przepuszcza do okna logowania,

No to w takim przypadku użytkownik zaufał certyfikatowi więc jest zaufany. Tak samo może go dodać na stałe do listy zaufanych certyfikatów.

Co konkretnie próbujesz zrobić? Co to znaczy "niezaufany użytkownik"?
Może chodzi ci o certyfikat klienta? Domyślnie tylko serwer próbuje udowodnić swoją tożsamość, a klient autentykuje się przez login i hasło ale jest możliwe zrobienie tego przez certyfikat klienta:

https://eranhadad.medium.com/net-core-kestrel-with-client-certificate-authentication-22717263cc1

// edit: sorry, źle przeczytałem, teraz widzę że napisałeś "certyfikat jest niezaufany" a nie "niezaufany użytkownik", niemniej podtrzymuję swoje zdanie

2

Chyba nie rozumiesz jak to powinno działać.
Twoja apka webowa posługuje się certyfikatem i kluczem prywatnym, by umożliwić weryfikację twojej usługi.
To ktoś się łączy do twojej apki to sprawdza certyfikat, żeby upewnić się, że łączy się z włściwym serwerem, któremu można zaufać.
Jeśli użtkownik, sam sobie dodaje twój certyfikat jako zaufany nie polegając na urzędzie certyfikacji, to ten użytkownik bierze odpowiedzialność za swoje zaufanie. To nie jest problem twojej aplikacji.

Jedynie co ty możesz zrobić, to zapewnić taki certyfikat, by użytkownik nie miał z nim problemów, zachęcających to omijania zabezpieczeń.
Czyli nie używaj SelfSigned certificate, tylko skonfiguruj swoją aplikacje tak, by posługiwała się certyfikatem podpisanym przez powszechnie używany urząd certyfikacji.
Jest wiele darmowych usług zapewniających wystawianie certyfikatów, dla stron www. Proces wystawiania certyfikatu jest w znacznym stopniu zautomatyzowany.

0
MarekR22 napisał(a):

Chyba nie rozumiesz jak to powinno działać.
Twoja apka webowa posługuje się certyfikatem i kluczem prywatnym, by umożliwić weryfikację twojej usługi.
To ktoś się łączy do twojej apki to sprawdza certyfikat, żeby upewnić się, że łączy się z włściwym serwerem, któremu można zaufać.
Jeśli użtkownik, sam sobie dodaje twój certyfikat jako zaufany nie polegając na urzędzie certyfikacji, to ten użytkownik bierze odpowiedzialność za swoje zaufanie. To nie jest problem twojej aplikacji.

Jedynie co ty możesz zrobić, to zapewnić taki certyfikat, by użytkownik nie miał z nim problemów, zachęcających to omijania zabezpieczeń.
Czyli nie używaj SelfSigned certificate, tylko skonfiguruj swoją aplikacje tak, by posługiwała się certyfikatem podpisanym przez powszechnie używany urząd certyfikacji.
Jest wiele darmowych usług zapewniających wystawianie certyfikatów, dla stron www. Proces wystawiania certyfikatu jest w znacznym stopniu zautomatyzowany.

Klient próbuje zalogować się do mojej aplikacji i otrzymuje komunikat o niebezpiecznym połączeniu i mimo tego potwierdza że chce kontynuować , wiec wygląda to tak:

screenshot-20240122210444.png
W tym momencie nie powinien mięć możliwości przejścia się do okna związanego z logowaniem, dopóki nie zainstaluje mu na kompie mojego self certificate.

screenshot-20240122210856.png

Dopiero teraz jak certyfikat będzie zaufany przez przeglądarkę klient powinien mieć możliwość otwarcia strony z logowaniem do aplikacji

Tak sobie to wymyśliłem :)

screenshot-20240122211032.png

1

@virusek391: chyba nie zauważyłeś postu @MarekR22 ? , ewentualnie przemyśl to co napisał @phantom_wizard

2
virusek391 napisał(a):

Tak sobie to wymyśliłem :)

Strasznie głupio :) Można wiedzieć jaki jest sens takiego zachowania?
To przeglądarka kontroluje czy puszczać ruch dalej i takie jest standardowe jej zachowanie - będziesz potrzebował własny plugin do przeglądarki lub własny klient aplikacji.

Nie wiem jaki problem chcesz rozwiązać, ale jeśli chcesz wymusić że musisz przyjść i zainstalować swój certyfikat żeby aplikacja ruszyła (bo może na przykład kasujesz opłatę za wizytę i to twój model biznesowy) to nadal proponuję rozwiązanie z certyfikatem klienta - będziesz musiał każdemu klientowi zainstalować własny certyfikat bo serwer go odrzuci

1

I jest jeszcze stackoverflow https://stackoverflow.com/questions/2618944/check-in-javascript-if-an-ssl-certificate-is-valid
ale nadal nie rozumiem po co to robić ?

0
obscurity napisał(a):
virusek391 napisał(a):

Tak sobie to wymyśliłem :)

Strasznie głupio :) Można wiedzieć jaki jest sens takiego zachowania?
To przeglądarka kontroluje czy puszczać ruch dalej i takie jest standardowe jej zachowanie - będziesz potrzebował własny plugin do przeglądarki lub własny klient aplikacji.

Nie wiem jaki problem chcesz rozwiązać, ale jeśli chcesz wymusić że musisz przyjść i zainstalować swój certyfikat żeby aplikacja ruszyła (bo może na przykład kasujesz opłatę za wizytę i to twój model biznesowy) to nadal proponuję rozwiązanie z certyfikatem klienta - będziesz musiał każdemu klientowi zainstalować własny certyfikat bo serwer go odrzuci

Użytkownik który znałby ścieżkę do aplikacji nie mógłby wejść do niej dopóki nie posiadałby takiego certyfikatu na swoim komputerze. Rozwiązanie to pozwoli logować się do aplikacji wyłącznie tym stacjom roboczym, które posiadają taki certyfikat.

1
virusek391 napisał(a):

Użytkownik który znałby ścieżkę do aplikacji nie mógłby wejść do niej dopóki nie posiadałby takiego certyfikatu na swoim komputerze. Rozwiązanie to pozwoli logować się do aplikacji wyłącznie tym stacjom roboczym, które posiadają taki certyfikat.

Czyli miałem rację i chcesz uwierzytelniać swoich klientów - po raz trzeci: użyj certyfikatu klienta. Zazwyczaj uwierzytelnienie klienta zachodzi przez podanie loginu i hasła i jest to w pełni wystarczające ale możesz użyć certyfikatu jeśli nie ufasz swojej aplikacji i myślisz że może być dziurawa.
Twoje rozwiązanie z certyfikatem serwera nie ma sensu, nadal każdy będzie mógł sobie zainstalować ten certyfikat samemu bo serwer go każdemu wysyła żeby się uwierzytelnić, nic fizycznie nie blokuje ruchu do serwera. Jeśli nawet zablokujesz to javascriptem czy w przeglądarce to będzie można dostać się do aplikacji choćby curlem lub wyłączyć skrypt który to blokuje.

Dodatkowy plus jeśli to zrobisz przez certyfikat klienta to w ogóle nie potrzebujesz ekranu logowania, możesz zmapować certyfikaty do użytkowników i na nich polegać jak na haśle. Korzystanie z aplikacji będzie wygodniejsze bo nie trzeba będzie się do niej dodatkowo logować.

0
obscurity napisał(a):
virusek391 napisał(a):

Użytkownik który znałby ścieżkę do aplikacji nie mógłby wejść do niej dopóki nie posiadałby takiego certyfikatu na swoim komputerze. Rozwiązanie to pozwoli logować się do aplikacji wyłącznie tym stacjom roboczym, które posiadają taki certyfikat.

Czyli miałem rację i chcesz autentykować swoich klientów - po raz trzeci: użyj certyfikatu klienta.
Twoje rozwiązanie nie ma sensu, nadal każdy będzie mógł sobie zainstalować ten certyfikat samemu, nic fizycznie nie blokuje ruchu do serwera. Jeśli nawet zablokujesz to javascriptem czy w przeglądarce to będzie można dostać się do aplikacji choćby curlem

Ok rozumiem, czyli moja idea upadła :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1