Przeglądarka nie zaakceptuje certyfikatu strony
Co to jest
Serwer odpowiada na porcie 443, ale certyfikat, który nam przekazał, przeglądarka by odrzuciła. Sprawdziliśmy go tak jak przeglądarka, tylko z zewnątrz. Niczego więcej na Twojej stronie nie testowaliśmy.
Z tego, co zobaczyliśmy, to jeden z takich przypadków:
- Self-signed: certyfikat wystawił sobie sam serwer i nikt zaufany go nie podpisał.
- Nazwa się nie zgadza: certyfikat wystawiono na inną domenę niż ta, pod którą działa strona (zwykle domyślny certyfikat hostingu).
- Niezaufany łańcuch: brakuje certyfikatu pośredniego albo certyfikat podpisał nieznany lub prywatny urząd.
- Jeszcze nieważny: początek ważności (
notBefore) jest w przyszłości. - Słaby klucz: klucz RSA krótszy niż 2048 bitów albo podpis SHA-1 lub MD5.
Dlaczego to problem
Odwiedzający zwykle widzi ostrzeżenie na całą stronę i większość osób zamyka kartę, tak jak przy wygasłym certyfikacie. Brak certyfikatu pośredniego to łagodniejszy przypadek: wiele przeglądarek pobiera go samodzielnie, ale inni klienci zawodzą (patrz niżej).
- Klienci API, bramki płatności i aplikacje mobilne odrzucą połączenie.
- Wyszukiwarki traktują stronę jako niegodną zaufania.
- Przyzwyczajenie do klikania „mimo to przejdź dalej” pomaga właśnie atakującemu na trasie podstawić własny certyfikat.
Jak to naprawić
Najpierw sprawdź, co wysyła serwer
openssl s_client -connect example.cz:443 -servername example.cz </dev/null 2>/dev/null |
openssl x509 -noout -subject -issuer -dates -ext subjectAltNameWynik pokazuje wystawcę (issuer), okres ważności i nazwy w subjectAltName. Po nim poznasz, który przypadek masz.
Self-signed, nieznany urząd, zła nazwa, słaby klucz
Wszystko rozwiązuje nowy certyfikat publicznego urzędu, który obejmuje domenę i wariant z www. Let’s Encrypt jest darmowy i wystawia nowoczesne klucze:
sudo certbot --nginx -d example.cz -d www.example.czBrakuje certyfikatu pośredniego
Serwer musi wysyłać cały łańcuch, nie tylko własny certyfikat. Wiele przeglądarek na komputerach ukrywa ten brak, pobierając brakujący certyfikat samodzielnie (przez AIA), więc u Ciebie strona może działać. Niektórzy klienci, na przykład klienci API, skrypty, bramki płatności i starszy Android, tego nie robią i odrzucają połączenie. W nginx użyj pliku fullchain.pem, a nie cert.pem:
ssl_certificate /etc/letsencrypt/live/example.cz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.cz/privkey.pem;W Apache wstaw fullchain.pem do SSLCertificateFile.
Jeszcze nieważny
Najczęściej zegar na maszynie, która wystawiała certyfikat, był zły. Sprawdź date i synchronizację czasu (NTP), potem wystaw certyfikat ponownie.
Hosting współdzielony
W panelu szukaj sekcji SSL lub HTTPS i dodaj certyfikat dla swojej domeny. Jeśli domyślny certyfikat hostingu zostaje, napisz do wsparcia.