jak sprawić, by Gnu / Linux ufał certyfikatowi, któremu Windows natychmiast zaufał?

11

Istnieje serwer z zepsutym łańcuchem SSL, zgodnie z tym sprawdzeniem protokołu SSL :

Raport z kontroli SSL

Wiem, że jest to problem, który powinien zostać rozwiązany na samym serwerze, ale czasem trudno go naprawić (nie jestem administratorem serwera).

Chodzi o to, że Chrome / Mozilla / Edge w systemie Windows i tak ufają certyfikatowi witryny :

wprowadź opis zdjęcia tutaj

Jednak we wdrożeniu Gnu / Linux (Ubuntu 18.04 w Docker) certyfikat nie jest zaufany:

curl: (60) SSL certificate problem: unable to get local issuer certificate

Próbowałem, update-ca-certificatesa nawet zaimportowałem certyfikat Globalsign Root. update-ca-certificatesw takim przypadku zgłosił duplikat certyfikatu. W każdym razie nic nie działa.

Jak się rozmnażać

Za pomocą Dockera:

docker run -it ubuntu:18.04

# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it  # <---- "unable to get local issuer certificate"

Jak sprawić, aby Gnu / Linux ufał temu certyfikatowi?

PS: Ten sam certyfikat jest poprawnie wdrożony na innym serwerze .

Udo G.
źródło
dlaczego głosowanie negatywne?
Udo G,
1
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ OP prosi o coś, na co nie może mieć wpływu. Powiedział, że nie może modyfikować niczego po stronie serwera , więc myślę, że prawdopodobnie należy to do administratora, ponieważ opisuje problem braku rozwiązania po stronie klienta.
LinuxSecurityFreak,
2
W szczególności proszę o rozwiązanie po stronie klienta . Nie mogę wpływać na serwer, ale mam pełną kontrolę nad systemem operacyjnym klienta (Ubuntu) i chcę, aby ta konkretna instalacja systemu operacyjnego ufała certyfikatowi, tak jak robią to inni operatorzy systemu operacyjnego (Windows). Nie chodzi o naprawianie strony HTTPS dla innych.
Udo G
1
Nie kontrolujesz serwera, ale nadal możesz zgłosić problem osobie, która kontroluje serwer.
Michael Hampton

Odpowiedzi:

11

Prawdziwą poprawką jest upewnienie się, że Twój serwer prezentuje wszystkie certyfikaty w łańcuchu, a nie tylko certyfikat encji końcowej (serwera).

Wskaż administratorowi serwera RFC 5246 sekcja 7.4.2, która wyraźnie stwierdza, że ten komunikat przekazuje łańcuch certyfikatów serwera do klienta.


Jeśli administrator z jakiegoś powodu odmawia / nie może tego zrobić, alternatywną opcją jest próba curlrozpoczęcia pracy z nieprawidłowo uściskiem dłoni.

Zgodnie z wiadomością na liście mailingowej Curl:

Czy ktoś może potwierdzić, czy cURL obsługuje (lub nie) certyfikat pośredni?

Tak. Wszystkie certyfikaty ca mają łańcuch certyfikatów prowadzący do katalogu głównego. Pakiet ca używany z curl musi składać się z certyfikatów dla całego łańcucha.

/ daniel.haxx.se

Powinno być możliwe dodanie głównego pakietu CA i wszystkich certyfikatów pośrednich do pakietu i wskazanie curlgo za pomocą --cacert <file>opcji.

Gdy przeglądarki działają, możesz uzyskać dostęp do odpowiednich certyfikatów CA. Na karcie certyfikatów (różnej dla każdej przeglądarki, ale jestem pewien, że ją znajdziesz), przejrzyj łańcuch certyfikatów. Dwukrotnie kliknij głównego urzędu pierwszy GlobalSign root CA - G1 i na szczegóły karcie, kliknij Kopiuj do pliku ... . Zapisz to jako root.cer. Zrób to samo z AlphaSSL CA - SHA256 - G2 i zapisz jako issuing.cer. Połącz oba razem w jednym pliku (np. chain.cer) I użyj tego jako argumentu -cacert.

Jak uprzejmie zauważył @AB, brakujący certyfikat można również znaleźć tutaj .


Twoje przeglądarki działają, ponieważ buforują certyfikaty CA. Jeśli w przeszłości przeszedłeś do prawidłowo skonfigurowanej witryny, której certyfikat został wydany przez ten sam urząd certyfikacji, co certyfikat twojego serwera, zostanie ona buforowana przez przeglądarkę. Gdy następnie odwiedzisz niepoprawnie skonfigurowaną witrynę, przeglądarka użyje certyfikatów CA w pamięci podręcznej do zbudowania łańcucha. Wydaje ci się, że wszystko jest w porządku, chociaż za kulisami serwer jest źle skonfigurowany.

Pamiętaj, że w systemach Windows IE / Edge i Chrome współużytkują tę samą pamięć podręczną, podczas gdy Firefox używa własnej pamięci podręcznej.

Oprócz powyższego IE / Edge i Chrome (ponieważ współużytkują ten sam stos kryptograficzny) będą używać rozszerzenia w certyfikatach o nazwie AuthorityInformationAccess . Jest to opcja caIssuer , która zapewnia adres URL, z którego można pobrać certyfikat CA certyfikatu podmiotu końcowego. Dlatego nawet jeśli jedna z tych przeglądarek nie buforowała brakujących certyfikatów z poprzedniego przeglądania, może ją pobrać w razie potrzeby. Pamiętaj, że Firefox tego nie robi, dlatego czasami Firefox może wyświetlać błędy certyfikatów, gdy IE / Edge i Chrome wydają się działać.

garethTheRed
źródło
1
To nie jest mój serwer, więc nie mogę niczego modyfikować po stronie serwera. Próbowałem użyć pakietu CA z curl.haxx.se/docs/caextract.html (ponieważ Firefox ufa certyfikatowi) i przekazałem go za pomocą, --cacert cacert.pemale CURL nadal nie akceptuje certyfikatu.
Udo G
1
To jest Twój serwer. Uruchom, echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443a zobaczysz tylko jeden certyfikat prezentowany przez serwer. Powinny istnieć dwa - certyfikat podmiotu końcowego (który jest prezentowany) i wydający CA - certyfikat Alpha SSL - SHA256 - G2. Ten ostatni nie jest wysyłany przez serwer, ale powinien.
garethTheRed
2
@garethTheRed: Rozumiem, że serwer nie przedstawia wszystkich certyfikatów, ale serwer nie jest pod moją kontrolą (to miałem na myśli przez „nie mój serwer”). Właśnie próbuję uzyskać dostęp do interfejsu API na obcym serwerze. W systemie Windows żadna z moich przeglądarek nie narzeka na certyfikat, tylko Linux / Debian / Ubuntu.
Udo G,
@AB: wielkie dzięki! Zainstalowanie wszystkich certyfikatów głównych z tej strony rozwiązało problem . Chciałbym jednak zrozumieć, dlaczego ten ręczny krok jest konieczny.
Udo G,
2
Brak pośredniego certyfikatu (jak wspomniano w @garethTheRed) można znaleźć tam: support.globalsign.com/customer/portal/articles/… . OP początkowo próbował jedynie dodać certyfikat root, który prawdopodobnie już był na miejscu, nie osiągając niczego.
AB