Wymiana certyfikatu SSL - problemy?



Chciałbym Wam opisać moje ostatnie przejścia z wymianą certyfikatu SSL na obecnej stronce. Niby nic trudnego, a jednak napotkałem pewne komplikacje. Sprawa była na tyle ciekawe, że postanowiłem się z Wami podzielić moimi spostrzeżeniami i podróżą krok po kroku niczym w detektywistycznym filmie :P Zapraszam do lektury.


Certificate Expiration Date - co robić, certyfikat niedługo wygaśnie

Stronka powstała już dwa lata temu. Kto by pomślał jak to szybko mineło. Osobiście mam nadzieję, że pomimo rożnej częstotliwości zamieszczania artykułów, znaleźleiście rzeczy które Wam choć trochę pomogły. Ale wracając do tematu. Na samym początku korzystałem przez jakiś czas z własnego certyfikatu, później po jakimś czasie postanowiłem być jak inni ludzie i skorzystałem z jednego z urzędów certyfiakacji (CA - Certificate Authority). Jest to podmiot, który wystawia Wam podpisany cyfrowo certyfikat SSL. Taki certyfikat podpisany przez CA potwierdza wiarygodność Waszej strony internetowej. Jesteście wtedy godni zaufania dla nowo odwiedzających Was przybyszów, a także tacy przybysze mogą się w pełni cieszyć szyfrowaną wersją protokołu http, czyli https. Certyfikat wygenerowałem, umieściłem, korzystałem, dwa lata mineły i trzeba wygenerowac kolejny certyfikat. Jakby tego było mało, na skrzynce mailowej pojawiła się przypominajka dodająca dramaturgi całemu procesowi.


Wymiana certyfikatu

Pomyślałem sobie: ok, certyfikat SSL wygaśnie dopiero za kilka dni, to ja będę sprytny i wygodny ;) W wolnym czasie wygeneruje certyfikat z pewnym wyprzedzeniem, zmienię konfig na web serwerze tak by obydwa były używane i przejście między certyfikatami przejdzie płynnie. Stary wygaśnie, a nowy automatycznie wskoczy na jego miejsce. A ja na spokojnie zaloguje się po tym czasie usunę stary certyfikat i usunę dodatkowe modyfikacje. Tak też uczyniłem. Sama generacja certyfikatu w CA się troszeczke pozmieniała, sam CA odświerzył trochę mechanizmy, wyglądało tyo teraz wizualnie o wiele lepiej. Nawet logowanie do CA odbywało się już poprzez automatycznie generowany klucz na moim komputerze. Wow, normalnie matrix, jestem pod wrażeniem. No ok, ale widzę, że ikonek, menu, przycisków jest teraz 3x więcej niż kiedyś. Okazuje się, że jak dwa lata temu było prymitywnie, to było także bardziej intuicyjnie. Teraz user friendly jest tylko na pierwszy rzut oka. Ogółem generuje się własny klucz prywatny, a oni na tej podstawie generują klucz publiczny. Natępnie umieszczam pliczek *.key, *.csr i *.pem w odpowiedniej lokalizacji lub lokalizacjach na serwerze. Na stronie CA podają nawet konkretną komendę jak wygenerować klucze *.key i *.csr. Miło z ich strony

openssl req -newkey rsa:2048 -keyout yourname.key -out yourname.csr

Wszystko poszło łatwo. Nadszedł wiekopomny dzień - pierwszy dzień z nowym certyfikatem. Wracam zmęczony po pracy do domu. Loguję się na stronkę, a stronka nie działa. Co jest grane, co się dzieje, niedostępnosć serwera, a ja nic nie wiem? To mi dało powód by wprowadzić informację mailowe o niedostępności serwera, ale o tym kiedy indziej ;) No dobrze, nasza pierwsza awaria, loguje się na serwer, zerkam i co widzę? Serwer webowy leży i kwiczy. Ponowne uruchomienie... i... prosba o hasło... Jakie hasło. Przeoczyłem, że przy generacji klucza,klucz został zabezpieczony hasłem. Mój bład. Ok, a jakie to było hasło. Mam, już mam. W pierwszej kolejności pomyśłąłem po co mi hasło no i zdjąłem je przy pomocy komendy:

openssl rsa -in file_with_pass.key -out file_without_pass.key
    Enter pass phrase for file_with_pass.key:
    writing RSA key
    

Uff..., już teraz wszystko działa. No ale tak na zdrowy rozsądek to lepiej mieć serwer zabazpieczony hasłem, więc przywróciłem zabezpieczony klucz. Minus tego rozwiązania, że przy każdym restacie usługi, czy serwera trzeba to hasło wpisać.


Nieoczekiwane problemy

Czas na testy. Na windowsie, wszystko śmiga, nowy certyfikat pięknie się sprawuje. Wbijam się na linuxa, uruchamiam stronkę, a tam bład certyfikatu. Hmm... coś jest nie tak. Brak https na linuxie, a na windowsie jest ok. Wchodzę na stronkę z telefonu (android), a tam także błąd certyfikatu.


Pierwsze co się rzuca w oczy to NET::ERR_CERT_AUTHORITY_INVALID. Okazuje się, że dla linuxów i pochodnych mój certyfikat jest niezaufany. Dziwne. Konsultuję sprawę z wójkiem Google i widze porady o czyszczeniu certyfikatów w przeglądarkach, ustawianiu im interwałów czasowych na automatyczne czyszczenie. Sobie myśle, może rzeczywiście przeglądarka ma zaszyty stary certyfikat i nie wie, że już z nowego korzystam. No to zastosowałem się do wskazówek. Niestety dalej bez zmian. W sieci natrafiłem nawet na porady typu "aby rozwiązać problem z certyfikatem dodaj wyjątek w przeglądarce i stronka będzie dzałać". Niesłuchajcie takich bzdur i trzymajcie się z daleka od tego typu porad. Co za sens, że stronka Wam się wyświetla jak problem nie zniknął. Tylko narażacie się na zagrożenia w sieci. Można to porównac do służby zdrowia w Polsce. Idziesz do lekarza, on Cię informuję co potencjalnie może Ci dolegać, przepisuje leki przeciwbólowe byś nie zauważał problemu i spławia by przyjąć kolejnego pacjenta lub zrobić kawkę lub posiedzieć w internetach. W rezultacie straciliśmy swój czas i często pieniądze, skierowania na dodatkowe badania nie mamy. Dostajemy tylko receptę na lek od firmy współpracującej z lekarze, by przemysł farmaceutyczny mógł zarabiać na naszym nieszczęściu. Ok, chyba odbiegłem nieco od tematu. Wójek Google nie pomógł, więc może źle wygenerowałem certyfikat. Przeszdłem jeszcze raz cała procedurkę generowania cartyfikatu w CA. Niestety dalej bez zmian. Co teraz? Przeskanuję certyfikaty pod kontem spójności danych. Hmm... pojawił się kolejny okruszek w całej tej układance. Mam informację że certyfikat jest niekompletny (Chain incompleted). To porównajmy nowe certy ze starymi. Okazuje się, że mój plik *.pem zawiera tylko podstawowa część klucza. Mój stary pliczek ma dodatkowe informację. W takim razie wymieniam plik *.pem na plik *bundle.crt. No i jest lepiej. Certyfikaty są w pełni spójne. Zerkam na stronkę na windowsie. Standardowo jest poprawnie i bez zmian. Zerkam na androidzie i linuxie i jest tak jak było, bez zmian - dalej nie działa https. Hmm... Skoro certyfikat jest ok, to co może być nie tak? Przekanuję stronę pod kontem bezpieczeństwa. No i jest kolejny okruszek. Podatności typu Oracle Padding w OpenSSL'u (CVE-2016-2107). Świeża sprawa. Tego typu problem pojawił się w ostatnich miesiącach z jeszzcze kilko podatnościami. Jest tego w sumie ok 5 szt. W dużym uproszczeniu problem polega na tym, że gdy gdy użytkownik do połączenia ze stroną nie jest w stanie użyć protokołu TLS 1.2 to jest w stanie używająć AES-CBC odszyfrować część danych podczas połączenia. Ostatnio jak skanowałem serwer to nie było jeszcze tej podatności. Czyli OpenSSL... to by się pokrywało z moim problemem. Jak to naprawić? Należy wykonać update openssl'a oraz libssl'a. Ja kożystam z ubuntu, tak więc szybkie sprawdzenie co wykorzystuje biblioteki i update. Poniżej consola poglądowa. Biblioteka na poniższej konsoli libssl już jest biblioteką po aktualizacjach.

dpkg -l | grep ssl
    ...
    ii  libssl-dev:amd64                          1.0.1f-1ubuntu2.19                                  amd64        Secure Sockets Layer toolkit - development files
    ii  libssl-doc                                1.0.1f-1ubuntu2.19                                  all          Secure Sockets Layer toolkit - development documentation
    ii  libssl1.0.0:amd64                         1.0.1f-1ubuntu2.19                                  amd64        Secure Sockets Layer toolkit - shared libraries
    ...
    ii  openssl                                   1.0.1f-1ubuntu2.19                                  amd64        Secure Sockets Layer toolkit - cryptographic utility
    ...
    apt-get update
    ...
    apt-get install openssl libssl1.0.0:amd64 libssl-dev:amd64 libssl-doc
    ...
    

Update wykonujecie poprzez apt-get install... Dokonuje się wtedy aktualizacja pakietów. Możecie je aktualizowac pojedyńczo, a możecie tak jak ja zrobić to hurtowo. Jeszcze tylko pozostało zrestartować nasz serwer web'owy i spojrzeć na przeglądarkę. Co się okazuje stronka działa w pełni poprawnie. Jeżeli mowa o ubuntu, to poniżej zamieszczam minimalne wersje jakie mają już zaimplementowane poprawki na wyżej wymienioną podatność:

Wersja systemu Wersja libssl1.0.0
Ubuntu 16.04 LTS 1.0.2g-1ubuntu4.1
Ubuntu 15.10 1.0.2d-0ubuntu1.5
Ubuntu 14.04 LTS 1.0.1f-1ubuntu2.19
Ubuntu 12.04 LTS 1.0.1-4ubuntu5.36


Podsumowując

Komunikaty błędów z jakimi się zmagałem nie były zgodne z faktycznymi problemami. Miałem pecha, że wymiana certyfikatu akurat zbiegła się w czasie odkrycia podatności w OpenSSL'u. Bardzo miło, że podatność w openssl'u jest sprawdzana w przeglądarkach internetowych, szkoda tylko, że nie miało to miejsca w windowsie. Okienka, jak się okazało, łykały wszystko jak leci bez żadnego komunikatu ostrzegawczego. Zerknijcie na swoje serwery, czy macie aktualna wersję openssl'a i libssl'a, a ja tymczasem kończę i dziękuję za uwagę.